解析:Bash参数和参数扩展

发布时间:2019-11-04编辑:脚本学堂
本文介绍下,bash编程中的一些参数,及参数扩展的一些知识,有需要的朋友参考下吧。

分享下bash参数与参数扩展的相关知识。

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,获取变量值的长度
   一般形式:${#变量名称}
   实例:

复制代码 代码示例:
x="hello world";
         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次替换
       ${变量名//要替换的字/新字} #将变量值中指定的字替换为新字,做所有替换
       实例:

复制代码 代码示例:
x="a1e b1e c2 d3 e4"
             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是否为空,若为空则错误输出指定的信息。
实例:

复制代码 代码示例:
a=${b:?} #则shell中错误输出-bash: b: error