天天看点

学习Bash 参数和参数扩展

   推荐学习IBM developerWorks的这篇文章 http://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html

   现做如下总结:

(1). 传递参数

   $0,$1,$2.......$N  :都是位置参数,其中$0可以表示为脚本名称(若在函数中调用则表示函数名称)。

   $* 和 $@ : 都表示除$0外的所有参数,两者在不用双引号包含时是1、一样的,也就是$*和$@是等价的,使用在双引号中扩展则不同,$*表示所有参数都作为1个单词,且受IFS特殊变量的影响(即所有参数由IFS进行分割连接),而$@把

每个参数都扩展为1个单词即"$@"等价于"$1" "$2" ..."$N".

   $# :表示参数数量(不含$0)

注:Shell 脚本处理参数的方式与函数处理参数的方式相同。

(2).获取参数的子集(子字符串)

   一般形式: ${参数名称:开始位置:长度}

   注:开始位置和长度为整数,且从0开始

   实例: x="hello world";

         echo ${x:6:5}  #输出world

(3).获取变量值的长度

   一般形式:${#变量名称}

         echo ${#x} #输出11

(4).模式匹配(可以使用通配符)

   [1].从左开始删除:

       ${变量名#要删除的字}   #表示从左边开始删除最短的匹配要删除的字

       ${变量名##要删除的字}  #表示从左边开始删除最长的匹配要删除的字

       实例:  x="a1e b1e c2 d3 e4"

              echo ${x#*1}  #则将a1删除,输出为 e b1e c2 d3 e4

              echo ${x##*1} #则删除a1e b1,输出为e c2 d3 e4

   [2].从右开始删除

       ${变量名%要删除的字}   #表示从右边开始删除最短的匹配要删除的字

       ${变量名%%要删除的字}  #表示从右边开始删除最长的匹配要删除的字

       实例: x="a1e b1e c2 d3 e4"

             echo ${x%1*} #则删除1e c2 d3 e4,输出为a1e b

             echo ${x%%1*}#则删除1e b1e c2 d3 e4,输出为a

   [3].替换字符

       ${变量名/要替换的字/新字} #将变量值中指定的字替换为新字,只做1次替换

       ${变量名//要替换的字/新字} #将变量值中指定的字替换为新字,做所有替换

             echo ${x/1/one} #输出aonee b1e c2 d3 e4

             echo ${x//1/one}#输出为aonee bonee c2 d3 e4

(5).设置默认值

   ${变量名:-默认值}  若指定的变量为空或者没有设置,则shell扩展默认值并替换结果,但是指定变量名的值没有更改。

       例如: a=${b:-Val1}  #则变量$a的值为Val1而变量b还是没有设置

   ${变量名:+默认值}  若指定的变量值设置且不为空则shell扩展默认值并替换结果,但是指定的变量值没有改变。

       例如:  b='val1'; a=${b:+val2}  #则$a值为val2而$b值为val1

   ${变量名:=默认值}  若指定的变量为空或者没有设置,则shell扩展默认值并替换结果,且指定变量名的值也更改为默认值。

       实例: a=${b:=val1} #则$a为val1且$b为val1

   ${变量名:?默认值} 若指定的变量为空或者没有设置,则shell扩展默认值并将结果写入标准错误中。可用于判断变量b是否为空,若为空则错误输出指定的信息。