我有两个问题,可以帮助理解它们。
${}
和$()
有什么区别?我知道()
意味着在单独的 shell 中运行命令并放置$
意味着将值传递给变量。有人可以帮助我理解这一点吗?如果我错了,请纠正我。如果我们可以使用
for ((i=0;i<10;i++)); do echo $i; done
并且它工作正常,那么为什么我不能将它用作while ((i=0;i<10;i++)); do echo $i; done
?两者的执行周期有什么区别?
原文由 Anaadih.pradeep 发布,翻译遵循 CC BY-SA 4.0 许可协议
语法是令牌级别的,因此美元符号的含义取决于它所在的令牌。表达式
$(command)
是`command`
的现代同义词,它代表命令替换;这意味着运行command
并将其输出放在这里。所以将运行
date
命令并将其输出包含在echo
的参数中。括号与在子 shell 中运行命令的语法无关,尽管它们有一些共同点(命令替换也在单独的子 shell 中运行)。By contrast,
${variable}
is just a disambiguation mechanism, so you can say${var}text
when you mean the contents of the variablevar
, followed bytext
(相对于$vartext
这意味着变量的内容vartext
)。while
循环需要一个参数,该参数应该评估为真或假(或实际上是多个,其中检查最后一个的真值 - 感谢 Jonathan Leffler 指出这一点);当它为假时,循环不再执行。for
循环遍历项目列表并将每个项目依次绑定到一个循环变量;您所指的语法是在一系列算术值上表达循环的一种(相当通用的)方法。像这样的
for
循环可以改写为while
循环。表达方式相当于
将所有循环控制保存在一个地方以提高可读性是有意义的;但正如您所看到的,当它像这样表达时,
for
循环比while
循环做得更多。当然,这种语法是 Bash 特有的;经典的 Bourne shell 只有
(更优雅的是,只要您确定参数字符串不包含任何
%
格式代码,您就可以避免第一个示例中的echo
:尽可能避免一个过程是一个重要的考虑因素,即使它在这个孤立的例子中并没有太大的区别。)