Bash 中 ${} 和 $() 的区别

新手上路,请多包涵

我有两个问题,可以帮助理解它们。

  1. ${}$() 有什么区别?我知道 () 意味着在单独的 shell 中运行命令并放置 $ 意味着将值传递给变量。有人可以帮助我理解这一点吗?如果我错了,请纠正我。

  2. 如果我们可以使用 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 许可协议

阅读 830
2 个回答

语法是令牌级别的,因此美元符号的含义取决于它所在的令牌。表达式 $(command)`command` 的现代同义词,它代表命令替换;这意味着运行 command 并将其输出放在这里。所以

echo "Today is $(date). A fine day."

将运行 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 variable var , followed by 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.'

尽可能避免一个过程是一个重要的考虑因素,即使它在这个孤立的例子中并没有太大的区别。)

原文由 tripleee 发布,翻译遵循 CC BY-SA 4.0 许可协议

  1. $() 意思是:“首先评估这个,然后评估该行的其余部分”。

前任 :

    echo $(pwd)/myFile.txt

将被解释为

   echo /my/path/myFile.txt

另一方面 ${} 扩展了一个变量。

前任:

    MY_VAR=toto
   echo ${MY_VAR}/myFile.txt

将被解释为

   echo toto/myFile.txt

  1. > 为什么我不能用它作为 bash$ while ((i=0;i<10;i++)); do echo $i; done

恐怕答案只是 --- 的 bash 语法与 while 的语法 for

原文由 gturri 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题