语法是令牌级别的,因此美元符号的含义取决于它所在的令牌。表达式$(command) 是`command` 的现代同义词,代表命令替换;这意味着运行command 并将其输出放在这里。所以
echo "Today is $(date). A fine day."
将运行date 命令并将其输出包含在echo 的参数中。括号与在子 shell 中运行命令的语法无关,尽管它们有一些共同点(命令替换也在单独的子 shell 中运行)。
相比之下,${variable} 只是一种消歧机制,所以当你表示变量 var 的内容时,你可以说 ${var}text,然后是 text(而不是 $vartext 表示内容变量vartext)。
while 循环需要一个参数,该参数的计算结果应为真或假(或实际上是多个,其中检查最后一个的真值 - 感谢 Jonathan Leffler 指出这一点);当它为假时,循环不再执行。 for 循环遍历项目列表并将每个项目依次绑定到一个循环变量;您所指的语法是一种(相当笼统的)在一系列算术值上表示循环的方法。
像这样的for 循环可以改写为while 循环。表达式
for ((init; check; step)); do
body
done
等价于
init
while check; do
body
step
done
为了便于阅读,将所有循环控制放在一个地方是有意义的;但正如你所看到的,当它像这样表达时,for 循环比while 循环做得更多。
当然,这种语法是特定于 Bash 的;经典的 Bourne shell 只有
for variable in token1 token2 ...; do
(更优雅的是,您可以避免第一个示例中的echo,只要您确定您的参数字符串不包含任何% 格式代码:
date +'Today is %c. A fine day.'
尽可能避免一个过程是一个重要的考虑因素,即使在这个孤立的示例中它并没有太大的区别。)