Shell 中的括号有其特殊的用法, 现总结如下:
1. 符号 $ 后的括号
${a}
变量 a 的值, 在不引起歧义的情况下可以省略大括号.$(cmd)
命令替换, 结果为 shell 命令 cmd 的输出, 和cmd
效果相同, 不过某些 Shell 版本不支持$()
形式的命令替换, 如tcsh
.$((exp))
和 `expr exp` 效果相同, 计算数学表达式 exp 的数值, 其中 exp 只要符合 C 语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算.
2. 多条命令执行
(cmd1;cmd2;cmd3)
新开一个子 shell 顺序执行命令 cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号.
{cmd1;cmd2;cmd3;}
在当前 shell 顺序执行命令 cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开.
对 {}
和 ()
而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令.
3. 双括号的特殊用法
(())
增强括号的用法, 常用于算术运算比较. 双括号中的变量可以不使用 $
符号前缀, 只要括号中的表达式符合 C 语言运算规则, 支持多个表达式用逗号分开.
比如可以直接使用 for((i=0;i<5;i++))
, 如果不使用双括号, 则为 for i in `seq 0 4` 或者 for i in {0..4}.
再如可以直接使用 if (($i<5))
, 如果不使用双括号, 则为 if [ $i -lt 5 ].
[[]]
增强方括号用法, 常用于字符串的比较. 主要用于条件测试, 双括号中的表达式可以使用 &&, ||, <, >
等 C 语言语法.
比如可以直接使用 if [[ $a != 1 && $a != 2 ]]
, 如果不适用双括号, 则为 if [ $a -ne 1] && [ $a != 2 ]
或者 if [ $a -ne 1 -a $a != 2 ]
.