bash的大括号(braces)在用法上共有三大类:
parameter subsitution,也叫parameter expansion-最广泛的一类
brace expansion-也是常用用法
code block-不是很常用
另外,还有一些其他用法。
parameter substitution是我们经常使用的功能,当然可能是无意的。
具体的内容比较多,参见此处
http://tldp.org/LDP/abs/html/parameter-substitution.html#PARAMSUBREF参数替换,字面理解“用参数替换(原来的变量)”,主要用在参数的输入场合,根据参数是否定义采用不同的值。
第一类形式:
${param:-default};${param-default}
若param未定义则令整个表达式的值为default。
${param:-default};${param-default}
若param未定义则令param的值为default。
${param:+default};${param+default}
若param已定义则令整个表达式的值为default。
${param:?-errormsg};${param?errormsg}
若param未定义,print errormsg,退出当前shell脚本,返回值为1。
注意,以上操作:*与*的区别在于它们怎么解释“param定义与否”:
:*认为"已定义"必须是“定义了并且已经赋值,该值不是null”
*认为"定义"就是“至少有前向声明",已经声明但未赋值(此时值为null)也被认为"已定义”
例如:
a=subs
b= #b被声明,但未赋值,这时,两种形式的变量替换行为是不同的
echo{b-$a}
echo{b:-$a}
subs
需要指出的是:最后一项在脚本的错误控制中用很大的用途。
第二类:
${#var}:将获得(字符串)变量长度, ${#},${@}将获得位置参数的个数,位置参数是命令行启动脚本是传递给脚本的参数
表。
${var#Pattern},${var##Pattern}
${var%Pattern},${var%%Pattern}
这两组就是俗称的变量的”掐头去尾“,非常强大,可以做正则匹配(将Pattern存为一个变量,然后${var%%$pattern_var}就好了),掐头去尾具体规则参看
http://www.cppblog.com/ewre/archive/2012/01/13/164132.html另外一种比较有用的处理方式就是substring replacement-子串替换。
形式:
${var/pattern/replacement}
${var//pattern/replacement}
区别在于上面的做first match替换,下面的做全局替换。例:
str="abcdabcd"
${str/abc/m}
${str//abc/m}
将输出
mdabcd
mdmd
与之相似的是prefix与suffix替换,形式结合了掐头去尾和子串替换:
${var/#pattern/replacement}
${var/%pattern/replacement}
另外,有一点要说的是,为什么bash大部分场合令‘#’与‘开头‘关联,‘%’与‘结尾’关联,我看过一篇帖子说
这是因为普通键盘上#位于$(你可以理解为bash的变量)的前面也就是头部,%位于$的后面也就是尾部,所以
他们分别成了头尾的代替符号。
以上提到的就是parameter substitution的大部分内容,它们大部分用在参数处理的场合。
brace expasion比较有意思,感觉与perl正则表达式里的[]有些共通的地方。具体形式:
echo var_{a,b,c,d}
var_a var_b var_c var_d
code block和c是相似的,相当于一个匿名函数块,不过该函数块内部的变量
外部是
可见的。
见此处后话:前面提到的大括号用法其实是shell在命令处理流程(shell operation)中的一些步骤。shell命令处理流程是这样的:
1,读入输入部分(从脚本或者字符串中)
2,把输入断成words和operators,切断是根据元字符(meta-character)进行的。
3,把2得到的结果进行解析,解析成简单和复合命令(simple and compound commands)
4,
做shell expansion(上面说的一些用法就是属于这里的一些操作,shell expansion 包括 {}expansion,~expansion,variable expansion,command expansion等等)
5,重定向解析
6,命令执行
7,收集命令执行结果返回值并退出。
以上提到的words operators meta-character simple and compound commands 是shell的定义
术语,具体请参看
此处。
特别要指出的是meta-character在shell中有明确的定义:在unquoting的情况下用于分隔words,这和我们
在学习c语言时的ascii码里的那些称为元字符的控制字符以及正则表达式中提到的元字符不完全等同,shell中的
meta-characters是:
space tab
| & ; ( ) < > 这9个。