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(改行和下一行一起操作,将换行符换成空格,合并为一行)