陈斌彬的技术博客

Stay foolish,stay hungry

Shell 中括号的特殊用法

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 ].