Shell中括号的作用
作者:Danbo 时间:2015-8-7
单小括号()
①.命令组。括号中的命令将会断开一个子Shell顺序执行,所以括号中的变量不能被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
②.命令替换。等同于`cmd`,Shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。
③.用于初始化数组。如:array=(a b c d)
双小括号(())
①.整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结果扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码1,或者是“假”,而一个非零值的表达式所返回的退出状态码将为0,或者是“true”。若是逻辑判断表达式exp为1则真,为0则假。
例如:
[root@localhost ~]# echo $((1+2));echo $?
3
0
[root@localhost ~]# echo $((1.1+2.2))
-bash: 1.1+2.2: syntax error: invalid arithmetic operator (error token is ".1+2.2")
[root@localhost ~]# echo $?
1
②.只要括号中的运算符、表达式符合C语言运算规则,都可用在$(())中,甚至是三目运算符。做不同进位运算,输出结果全部转化成了十进制。如下所示:
[root@localhost ~]# echo $((16#5f))
95 #即将16进制5f转换为十进制95
③.单纯用(())也可重定义变量值,比如,a=5;((a++))可将$a重定义为6
④.常用于算术运算比较双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用分号分开。只要括号中的表达式符合C语言运算规则,比如可以直接使用:for ((i=0;i<5;i++)),如果不使用双括号,则为:for i in `seq 4`或者for i in {0..4}。再如可以直接使用if (($i<5)),如果不使用双括号,则未if [ $i -lt 5 ]。
单中括号
①.bash内部命令,“[”和test是等同的。如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构总共的左中括号是调用test的命令标识,有中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。
②.Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,可以使用转义字符,如下面这样:[ ab < bc ],结果为真返回0,[ ]中的逻辑与和逻辑或使用-a和-o表示。
③.字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。
④.在一个array结构的上下文中,中括号用来引用数组中每个元素的编号。
双中括号
①.[[ ]]结构比[ ]结构更加通用。
②.支持字符串的模式匹配,字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,[[ hello == hell? ]],结果为真。
③.使用[[...]]条件判断结构,而不是[...],能够防止脚本中的许多逻辑错误。比如,&&、||操作符能够正常存在于[[]]条件为判断结构中,如果使用在[]就会出错。
例如:
if [ $a -ne 1 -a $a != 2 ]
if [ $a -ne 1] && [ $a != 2 ]
if [[ $a != 1 && $a != 2 ]]
大括号
①.对大括号中的文件名做扩展。比如:touch {a,d}.txt结果为:a.txt、d.txt。touch {a..d}.txt结果为:a.txt、b.txt、c.txt、d.txt。。
②.代码块,又被称为内部组,这个结构事实上创建了一个匿名函数。与小括号中的命令不同,大括号内的命令不会新开一个子Shell运行,即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开,最后一个也必须有分号。{ }的第一个命令和左括号之间必须有一个空格。
符号$后的括号
①.${a} 变量a的值,在不引起歧义的情况下可以省略大括号。
②.$(cmd) 命令替换,和`cmd`效果相同。
③.$((expression))和`expression`效果相同,计算数学表达式exp的数值,其中exp只要符合C语言的运算规则即可,甚至三目运算符和逻辑表达式都可以计算。
多条明命令执行
①.单小括号:(cmd1;cmc2;cmd3)
②.单大括号:{ cmd1;cmd2;cmd3; }