括号[是shell的内置命令;你也可以叫它test:
if [ a = b ]
then ...
等于:
if test a = b
then ...
test 命令的语法是面向文本的(有关详细信息,请参阅 bash 手册页 CONDITIONAL EXPRESSIONS 章节)。
大括号{…} 是shell 语法,用于对命令进行分组(不创建子shell):
{ date; ls; echo $$; } > 1>&2
这将执行date、ls 和echo $$ 并将它们的所有输出重定向到stderr。
括号(…) 是shell 语法,用于创建子shell:
(date; ls; echo $$) > 1>&2
与上面类似,但给出的 PID ($$) 是子shell 的。
分组和子外壳之间的区别很微妙(这里超出了范围)。
双括号 [[…]] 是 shell 语法,但在其他方面的行为类似于单括号 [ 命令。唯一的区别是使用< 等进行字符串比较和语言环境支持。
双括号((…)) 等效于使用let 内置shell 命令。它们基本上允许评估面向数字的表达式 (ARITHMETIC EVALUATION)。 < 和 > 按数字排序(而不是按字典顺序)等。此外,在 for ((i=0; i<10; i++)); do echo "$i"; done 等一些结构中,它们被用作固定语法。
美元括号$(…) 导致它们所包含的命令的输出:
echo "$(date)" # a complicated way to execute date
美元括号 $[…] 已弃用,应替换为美元双括号。
美元双括号 $((…)) 产生它们所包含的数值表达式的值:
echo "$((4 + 3 * 2))" # should print 10
美元大括号${…} 导致它们包含的变量扩展。在最简单的情况下,这只是一个变量名,然后它们评估为变量值:
a=foo
echo "${a}" # prints foo
这可以(而且经常是)通过去掉大括号来缩写:$a
但它也可以像${a:-"today is $(date)"} 这样更复杂。有关详细信息,请参阅 bash 手册页中的 Parameter Expansion。
重定向括号<(…) 和>(…) 创建一个子进程,一个与它的输出/输入相关联的文件描述符,以及一个与该描述符相关联的伪文件。它可用于将程序的输出作为看似文件传递给另一个程序:diff <(sleep 1; date) <(sleep 2; date)