Linux中的小括号和大括号,${}/$()/()/{}/${var:-string}/${var:=string}/${var:+string}/${var:?string}/${var%pattern}/${var#pattern}/${var%%pattern}/${var##pattern}
简单记录一下大小括号在Linux中的用处。
1、${var},这是Linux中变量的原形。所以$var,别忘记了你的本来面目。
# a=10 # echo $a 10 # echo ${a} 10 # echo ${a}b 10b
2、$(command)与`command`效果相同,意为用command命令执行得到的标准输出来替换$(command)。
# echo $(ls) temp1 temp2 #echo `ls` temp1 temp2
3、()与{}两者都是用来执行一串命令的。但是有区别的哦
#两者都是用;来分隔命令的
# (a=abc;echo $a;) abc # { a=abc;echo $a;) abc
#{}左括号{后面要跟空格,()就不用了。
# {a=abc;echo $a;} -bash: syntax error near unexpected token `}'
#()最后一个命令可以不带;,但是{}强制带;。
#()会在当前shell基础上开一个子shell进程来运行命令,但是{}是在当前shell直接运行命令。()新开一个子进程的时候,是会继承当前shell的环境的,但是在子进程任何操作是不会影响父进程(当前shell进程)的。
# a=abc # echo $a abc # (echo $a) abc # (a=123; echo $a;) 123 # echo $a abc # a=abc # { a=123;echo $a;} 123 # echo $a 123 #{}是当前进程下运行命令,所以a=123对当前的$a生效了。
4、${var:-string}/${var:=string}/${var:+string}/${var:?string}
现在知道上面提到的{为什么后面要带空格了吧,因为{还有其他用途的。
简单说明一下:
${var:-string} -- 如果${var}为空,用string替换${var:-string},否则使用${var}替换
${var:=string} -- 如果${var}为空,用string替换${var:=string},并且${var}赋值为string,否则同上
${var:+string} -- 如果${var}不为空,则用string替换${var:+string},否则同上(也就是空)
${var:?string} -- 如果${var}为空,报错并退出程序(命令。。。),否则${var}替换${var:?string}
5、${var%pattern}/${var#pattern}/${var%%pattern}/${var##pattern}
% : 从后向前匹配
# :从前向后匹配
%% 和##:最长匹配,相对的%/#表示最短匹配,不过,这个只有在pattern含有通配符是才有效。
通配符:*匹配0或多个任意字符,?匹配0或1个任意字符,[...]匹配,[]里任意一个字符,[^...]匹配任意不在[^]里的任意一个字符。
# a=aabbccddee # echo ${a%e} aabbccdde # echo ${a%%e} aabbccdde #没有通配符,与%一个样 # echo ${a%e*} aabbccdde # echo ${a%%e*} aabbccdd
6、$((exp)),扩展运算
# echo $((1+2)) 3 # a=1 # echo $((a+2) 3
参考:http://my.oschina.net/xiangxw/blog/11407