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

Ana*_*eep 77 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?两者的执行周期有什么不同?

tri*_*eee 127

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

echo "Today is $(date). A fine day."
Run Code Online (Sandbox Code Playgroud)

将运行该date命令并将其输出包含在参数中echo.括号是无关的语法在子shell中运行的命令,但他们有一个共同点(命令替换也是一个独立的子shell中运行).

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

while环路期望应该评估为真或假的一个参数(或实际多个,其中检查的最后一个的真值-感谢乔纳森·莱弗勒指出了这一点); 当它为假时,循环不再执行.在for以上的项目的列表循环迭代并结合到每个依次循环变量; 你引用的语法是一种 - 相当概括 - 表示一系列算术值的循环的方法.

for像这样的循环可以被重新描述为while循环.表达方式

for ((init; check; step)); do
    body
done
Run Code Online (Sandbox Code Playgroud)

相当于

init
while check; do
    body
    step
done
Run Code Online (Sandbox Code Playgroud)

将所有循环控制保持在一个位置以便于读取是有意义的; 但正如你可以看到它表达的时候,for循环比while循环更多.

当然,这种语法是特定于Bash的; 经典的Bourne shell只有

for variable in token1 token2 ...; do
Run Code Online (Sandbox Code Playgroud)

(更优雅的是,echo只要您确定您的参数字符串不包含任何%格式代码,您就可以避免在第一个示例中使用:

date +'Today is %c. A fine day.'
Run Code Online (Sandbox Code Playgroud)

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

  • 严格来说,一个“while”命令需要一个命令序列(不一定是管道),序列中最后一个命令的退出状态决定了循环是否继续。因此:`while ls; 密码; 日期; 做回声嗨; 睡眠 1; done` 有效,`date` 的退出状态控制循环是否继续。我使用分号是因为您不能在注释中格式化换行符,但您可以在 shell 脚本中的多行上编写命令。 (2认同)

gtu*_*rri 45

  1. $() 意思是:"首先对此进行评估,然后评估其余部分".

    例如:

    echo $(pwd)/myFile.txt
    
    Run Code Online (Sandbox Code Playgroud)

    将被解释为

    echo /my/path/myFile.txt
    
    Run Code Online (Sandbox Code Playgroud)

    另一方面${}扩展变量.

    例如:

    MY_VAR=toto
    echo ${MY_VAR}/myFile.txt
    
    Run Code Online (Sandbox Code Playgroud)

    将被解释为

    echo toto/myFile.txt
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为什么我不能用它 bash$ while ((i=0;i<10;i++)); do echo $i; done

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

  • "首先对此进行评估,然后评估其余部分" - 我不理解`$(...)`的这种描述. (3认同)