Linux命令行与shell脚本编程大全 part 3

chapter 17 创建函数

function name{
   commands
}

name(){
   commands
}

在行中直接指定函数名就可以调用函数,先定义,再调用

bash shell会把函数当作一个小型脚本,运行结束时返回一个退出状态码。默认情况下,是最后一条指令的退出状态码。可以用$?来确定函数退出状态码。

也可以用return来返回,但是只能返回0-255.

#!/bin/bash

function db1{
   read -p "Enter a value: " value
   echo $[ $value * 2]
}

result=$(db1)
echo "The new value is $result"

函数使用特殊参数环境变量作为自己的参数值,因此无法直接获取脚本在命令行的参数值。必须要调用函数时传过去

#!/bin/bash

function func7{
   echo $[ $1*$2 ]
}

if [ $# -eq 2 ]
then
   value=$(func7 $1 $2)
   echo "The result is $value"
else
   echo "Usage: badtest1 a b"
fi

local关键字保证了变量只局限在该函数中

传递数组变量时,方式比较特殊

#!/bin/bash

function addarray {
   local sum=0
   local newarray
   newarray=($(echo "$@"))
   for value in ${newarray[*]}
   do
      sum=$[ $sum + $value ]
   done
   echo $sum
}

myarray=(1 2 3 4 5)
echo "The original array is: $myarray[*]"
argl=$(echo ${myarray[*]})
result=$(addarray $argl)
echo "The result is $result"

函数返回数组

$!/bin/bash

function arraydblr {
   local origarray
   local newarray
   local elements
   local i
   origarray=($(echo "$@"))
   newarray=($(echo "$@"))
   elements=$[ $# -1 ]
   for((i=0;i<=$elements;i++)){
      newarray[$i]=$[${origarray[$i]}*2]
   }
   echo ${newarray[*]}

}

myarray=(1 2 3 4 5)
echo "The original array is : ${myarray[*]}"
argl=$(echo ${myarray[*]})
result=($(arraydblr $argl))
echo "The new array is: ${result[*]}"

使用函数库的关键在于source命令,如果myfuncs是库文件,那么执行. ./myfuncs

在命令行上定义函数时,必须在每个命令后面加;

可以直接在.bashrc文件末尾定义函数,这样他就能够在启动bash shell时生效。或者在.bashrc中添加库文件的函数

. /home/rich/myfuncs

chapter 18 图形化桌面环境的脚本编程

(跳过了)

chapter 19 初识sed和gawk

sed默认将指定命令应用到STDIN输入流上,修改后的数据发送到STDOUT

echo "This is a test" | sed 's/test/big test/'

(big test 替换test)

sed 's/dog/cat/; s/dog/cat/' data1.txt

sed -f scr1.sed data1.txt(将命令放在sed文件中,按行执行命令)

gawk若没有指定文件名,那么就从STDIN获取输入,要退出程序,则需要按Ctrl + D

gawk在引用变量时不用$

BEGIN关键字会强制gawk在读取数据前执行BEGIN关键字后指定的程序脚本

END关键字允许你指定一个程序脚本,gawk会在读完数据后执行它。

gawk 'BEGIN {
print "The data3 File Contents:"
FS=":"
}
{print $0}
END {print "End of File"}' data3.txt

sed可以指定行号,进行操作。(sed '2,$s/dog/cat/' data1.txt)

如果需要在单行上执行多条命令,可以用花括号将多条命令组合在一起。

sed '2,${
s/fox/elephant/
s/dog/cat/
}' data1.txt

删除行

sed '3,$d' data6.txt

sed '/number 1/d' data6.txt

sed '/1/,/3/d' data7.txt

修改行(匹配带有number 3的行,并替换为\后紧跟的字符串)

sed '/number 3/c\

This is a changed line of text. ' data6.txt

注意,使用地址区间替换的时候,结果未必如愿

sed '2,3c\

This is a changed line of text. ' data6.txt

这一句,只是将两行文本,替换为给出的一行文本,而不是逐一替换·

转换命令

sed 'y/123/789/' data8.txt(1换成7,2换成8,3换成9)

sed -n '/3/{

p

s/line/test/p

}' data6.txt

=符号 打印行号

sed -n '/number 4/{

=

p

}' data1.txt

列出制表符等不可打印的ascii字符

sed -n ‘l’ data9.txt

sed ‘1,2w test.txt’ data6.txt

将data6.txt的前两行打印到test.txt中

sed '3r data12.txt' data6.txt

将data12.txt 中的数据插入到data6.txt的第三行之后

sed '/LIST/{

r detail.txt

d

}' notice.std

将LIST替换为文本中的内容

chapter 20 正则表达式

sed '/^$/d' data5 过滤空白行

sed -n '/[a-ch-m][^ch]at[1-9]$/p' data6

expr1 | expr2(有一个表达式通过就算匹配成功)

chapter 21 sed进阶

sed '/first/{ N ; s/\n/ / }' data2.txt(改行和下一行一起操作,将换行符换成空格,合并为一行)

猜你喜欢

转载自blog.csdn.net/qq_40473204/article/details/113760655