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

我有两个问题,希望有人能帮助我理解。

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

  2. 如果我们可以使用 for ((i=0;i<10;i++)); do echo $i; done,它工作得很好,那么为什么我不能使用它作为 while ((i=0;i<10;i++)); do echo $i; done?两者在执行周期上有什么不同?

178313 次浏览
  1. 你的理解是正确的。关于{}的详细信息见 Bash 参数扩展

  2. For 和 while 有不同的语法,并为迭代提供不同的程序员控制风格。大多数非 asm 语言都提供了类似的语法。

使用 while,您可能会编写 i=0; while [ $i -lt 10 ]; do echo $i; i=$(( i + 1 )); done,本质上是自己管理关于迭代的所有事情

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

    例如:

    echo $(pwd)/myFile.txt
    

    会被解释为

    echo /my/path/myFile.txt
    

    另一方面,${}展开一个变量。

    例如:

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

    会被解释为

    echo toto/myFile.txt
    
  2. Why can't I use it as bash$ while ((i=0;i<10;i++)); do echo $i; done

    I'm afraid the answer is just that the bash syntax for while just isn't the same as the syntax for for.

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

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

将运行 date命令并将其输出包含在 echo的参数中。括号与在子 shell 中运行命令的语法无关,尽管它们有一些共同之处(指令替代也在单独的子 shell 中运行)。

相比之下,${variable}只是一个消除歧义的机制,所以当你指的是变量 var的内容时,你可以说 ${var}text,然后是 text(与 $vartext相反,$vartext指的是变量 vartext的内容)。

while循环需要一个参数,它的值应该是 true 或 false (或者实际上是多个参数,其中检查了最后一个参数的 true 值——感谢 Jonathan Leffler 指出这一点) ; 当它为 false 时,循环不再执行。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.'

尽管在这个孤立的例子中,避免使用可以使用的流程并没有太大的不同,但这仍然是一个重要的考虑因素。)