Bash中$ {}和$()之间的差异

时间:2014-12-14 18:26:52

标签: linux bash scripting

我有两个问题,可以使用一些帮助来理解它们。

  1. ${}$()之间有什么区别?我理解() 表示在单独的shell中运行命令,放置$表示传递 变量的值。有人可以帮助我理解 这个?如果我错了,请纠正我。

  2. 如果我们可以使用for ((i=0;i<10;i++)); do echo $i; done并且工作正常,那么为什么我不能将其用作while ((i=0;i<10;i++)); do echo $i; done?两者的执行周期有何不同?

3 个答案:

答案 0 :(得分:95)

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

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

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

相比之下,${variable}只是一种消歧机制,所以你可以说${var}text,你的意思是变量var的内容,然后是text(如与$vartext相对,这意味着变量vartext)的内容。

while循环需要一个应该评估为true或false的参数(或者实际上是多个,其中检查最后一个的真值 - 感谢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.'

尽管在这个孤立的例子中没有产生很大的不同,但是避免一个可以学习的过程是一个重要的学习考虑因素。)

答案 1 :(得分:39)

  1. $()表示:“首先对此进行评估,然后评估其余部分”。

    前:

    echo $(pwd)/myFile.txt
    

    将被解释为

    echo /my/path/myFile.txt
    

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

    例如:

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

    将被解释为

    echo toto/myFile.txt
    
  2.   

    为什么我不能将其用作bash$ while ((i=0;i<10;i++)); do echo $i; done

    我担心答案只是while的bash语法与for的语法不同。

答案 2 :(得分:-2)

  1. 你的理解是正确的。有关{}的详细信息,请参阅bash ref - parameter expansion

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

  3. 有一段时间,您可能会写i=0; while [ $i -lt 10 ]; do echo $i; i=$(( i + 1 )); done本质上自己管理有关迭代的所有内容