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

posted @ 2013-09-13 15:50  luffy_zhong  阅读(2651)  评论(0编辑  收藏  举报