第十二单元 shell脚本高级编程:函数、数组实战
shell脚本高级编程:函数、数组实战
case语句的语法格式:
read -p "Enter you option:" optioncase $option in
pat1)
分支1;;
pat2)
分支2;;
*)
分支n;;
esac
函数:function
过程式编程:代码重用把一段独立功能的代码当做一个整体,并为之一个名字;命名的代码段,此即为函数;
注意:定义函数的代码段不会自动执行,在调用时执行;所谓调用函数,在代码中给定函数名即可;
函数名出现的任何位置,在代码执行时,都会被自动替换为函数代码
语法一:
function f_name {
...函数体...
}
语法二:
f_name(){
...函数体...
}
函数的生命周期:每次被调用时创建,返回时终止;
其状态返回结果为函数体中运行的最后一条命令的状态结果;
自定义状态返回值,需要使用:return
return[0-255]
0:成功
1-255: 失败
函数返回值:
函数的执行结果返回值:
1、使用echo或print命令进行输出
2、函数体中调用的命令的执行结果
函数的推出状态码
1、默认取决于函数体中执行的最后一条命令的退出状态码
2、自定义:return
函数可以接受参数:
传递参数给函数:
在函数体中当中,可以使用$1,$2...引用传递给函数的参数;还可以函数中使用$*或$@引用所有参数,$#引用传递的参数的个数;
在调用函数时,在函数名后面以空白字符分隔给定参数列表即可,例如,testfunc arg1 arg2 arg3 ...
数组
declare命令:-a:将变量声明为数组型。
-i:将变量声明为整数型(integer)。
数组中元素的赋值方式:
1、一次只赋值一个元素:
ARRAY_NAME[INDEX]=value
2、一次赋值全部元素:
ARRAY_NAME=("VAL1","VAL2","VAL3")
3、只赋值特定元素
ARRAY_NAME=([0]="VAL1",[3]="VAL4")
注意:bash支持稀疏格式的数组
4、read -a ARRAY_NAME
引用数组中的元素:${ARRAY_NAME[INDEX]}
注意:引用时,只给数组名,表示引用下标为0的元素
数组的长度(数组中元素的个数):
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}
数组元素切片:
${ARRAY_NAME[@]:offset:number}
offset:要跳过的元素个数
number:要取出的元素个数;省略number时,表示取偏移量的所有元素
向数组中追加元素:
ARRAY_NAME[${ARRAY_NAME[*]}]=
删除数组中的某元素:
unset ARRAY_NAME[INDEX]
管理数组:
declare -A ARRAY_NAME
ARRAY_NAME=([index_name1]="value1" index_name2="value2")
bash的内置字符串处理工具:
字符串切片:
$(var:offset:number)基于模式取子串
${var#*word}:其中word是指定的分隔符;功能自左而右,查找var变量所存储的字符串中,第一次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符。${var##*work}:其中word是指定的分隔符;功能自左而右,查找var变量所存储的字符串中,最后一次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符。
mypath="/etc/init.d/functions"
${mypath#*/}结果为:etc/init.d/functions
${mypath##*/}结果为:functions
${var%word*}:其中word是指定的分隔符;功能自右而左,查找var变量所存储的字符串中,第一次出现的word分隔符,删除此字符串至此分隔符之间的所有字符。
${var%%word*}:其中word是指定的分隔符;功能自右而左,查找var变量所存储的字符串中,最后一次出现的word分隔符,删除此字符串至此分隔符之间的所有字符。
mypath="/etc/init.d/functions"
${mypath%/*}结果为:/etc/init.d
url=http://www.magedu.com:80
${url##*:}结果为80
${url%%:*}结果为http
查找替换:
${var/PATTERN/SUBSTI}:查找var所表示的字符串中,第一次被PATTERN所匹配到的字符串,将其替换为SUBSTI所表示的字符串${var//PATTERN/SUBSTI}:查找var所表示的字符串中,所有被PATTERN所匹配到的字符串,将其全部替换为SUBSTI所表示的字符串
${var/#PATTERN/SUBSTI}:查找var所表示的字符串中,行首被PATTERN所匹配到的字符串,将其替换为SUBSTI所表示的字符串
${var/%PATTERN/SUBSTI}:查找var所表示的字符串中,行尾被PATTERN所匹配到的字符串,将其替换为SUBSTI所表示的字符串
注意:PATTERN中使用glob风格和通配符
查找删除:
${var/PATTERN}:以PATTERN为模式查找var字符串中第一次的匹配,并删除之${var/PATTERN}:以PATTERN为模式查找var字符串中所有匹配的,并删除之
${var/#PATTERN}:以PATTERN为模式查找var字符串中行首匹配的,并删除之
${var/%PATTERN}:以PATTERN为模式查找var字符串中行尾匹配的,并删除之
字符大小写转换
${var^^}:把var中所有的小写字符转换为大写${var,,}:把var中所有的小写字符转换为大写
变量赋值:
${var:-VALUE}:如果var变量为空,或未设置,那么返回VALUE;否则,返回var变量的值${var:=VALUE}:如果var变量为空,或未设置,那么返回VALUE;并将VALUE赋值给var变量,否则,则返回变量的值
${var:+VALUE}:如果var不空,则返回VALUE
${var:?ERROR_INFO}:如果var为空,或未设置,那么返回ERROR_INFO为错误提示;否则,返回var值
不积跬步,无以至千里;不积小流,无以成江海。