Backticks vs Bash中的大括号

roj*_*oke 45 bash command-substitution

当我去回答这个问题时,我打算使用这个${}符号,因为我在这里已经看过很多次,所以最好用反引号.

但是,当我尝试

joulesFinal=${echo $joules2 \* $cpu | bc}
Run Code Online (Sandbox Code Playgroud)

我收到了消息

-bash: ${echo $joules * $cpu | bc}: bad substitution
Run Code Online (Sandbox Code Playgroud)

joulesFinal=`echo $joules2 \* $cpu | bc`
Run Code Online (Sandbox Code Playgroud)

工作良好.那么我需要做出哪些其他改变呢?

fed*_*qui 72

当你使用(花括号)时,它`` 被称为命令替换并且等同于$()(${}括号).

所以这些是平等的,意思是"解释放在里面的命令":

joulesFinal=`echo $joules2 \* $cpu | bc`
joulesFinal=$(echo $joules2 \* $cpu | bc)
             ^                          ^
       ( instead of {             ) instead of }
Run Code Online (Sandbox Code Playgroud)

虽然${}表达式被用于变量替换.


来自man bash:

命令替换允许输出命令来替换命令名称.有两种形式:

          $(command)
   or
          `command`
Run Code Online (Sandbox Code Playgroud)

此外,``更难以处理,例如,你不能嵌套它们.请参阅下面的评论以及为什么$(...)首选...(反引号)?.

  • 你可以补充说,不赞成使用backtics而且`$()`与POSIX兼容. (13认同)
  • 即使你没有嵌套,很多控制台字体也很容易忽略反引号.`$()`更不用说了. (5认同)
  • ...在[bash项目](http://wiki.bash-hackers.org/scripting/obsolete)中也没有发现"真正的"弃用,这意味着暗示将在即将发布的版本中删除backtics.似乎使用`$()`只是*首选方式*.对困惑感到抱歉 :) (4认同)
  • 我已经对其进行了调查,并且我不得不承认,支持标准确实与[POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03)标准兼容。但是,bash不推荐使用它们,并且`$()`更好地处理(+1)仍然是事实。 (3认同)
  • 没问题,@ hek2mgl,我觉得很有意思.我有时在这里读到它已被弃用,所以通常这么认为(我甚至认为).但对我来说,使用`$()`代替````的最重要的原因是,第一个你可以嵌套,而第二个不允许它. (3认同)
  • 你可以用“\`\`”嵌套,只是很难看。“回声\`回声\`回声abc\`\`”有效。 (3认同)

Gun*_*ick 23

在特定情况下,它们的行为略有不同:

$ echo "`echo \"test\" `"
test
$ echo "$(echo \"test\" )"
"test"
Run Code Online (Sandbox Code Playgroud)

所以反引号默默地删除双引号.