【问题标题】:Backticks vs braces in BashBash中的反引号与大括号
【发布时间】:2014-03-28 09:55:27
【问题描述】:

当我去回答 this question 时,我打算使用 ${} 表示法,因为我在这里见过很多次,所以它比反引号更可取。

但是,当我尝试时

joulesFinal=${echo $joules2 \* $cpu | bc}

我收到了消息

-bash: ${echo $joules * $cpu | bc}: bad substitution

但是

joulesFinal=`echo $joules2 \* $cpu | bc`

工作正常。那么我还需要进行哪些其他更改?

【问题讨论】:

标签: bash command-substitution


【解决方案1】:

`` 称为命令替换,等效于$()(括号),而您使用的是${}(大括号)。

所以所有这些表达式都是相等的,意思是“解释放置在里面的命令”:

joulesFinal=`echo $joules2 \* $cpu | bc`
joulesFinal=$(echo $joules2 \* $cpu | bc)
#            v                          v
#      ( instead of {                   v
#                                 ) instead of }

${} 表达式用于变量替换。

但请注意,反引号已被弃用,而 $() 与 POSIX 兼容,因此您应该更喜欢后者。


来自man bash

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

          $(command)
   or
          `command`

另外,`` 更难处理,例如你不能嵌套它们。请参阅下面的 cmets 以及 Why is $(...) preferred over ... (backticks)?

【讨论】:

  • 我已经调查过了,我不得不承认 backtics 确实与POSIX 标准兼容。但是,bash 已弃用它们仍然是事实,并且 $() 更好处理 (+1)
  • ... 在bash project 中也没有发现“真正的”弃用,这意味着暗示将在即将发布的版本中删除反引号。似乎使用$() 只是首选方式。很抱歉造成混乱:)
  • 没问题,@hek2mgl,我觉得很有趣。我有时在这里读到它已被弃用,所以通常这样认为(我什至认为)。但对我来说,使用$() 而不是` ` 最重要的原因是第一个可以嵌套,而第二个不允许。
  • 即使你不嵌套,反引号在相当多的控制台字体中也很容易被忽略。 $() 更不用说了。
  • 你可以用“``”嵌套,它只是丑陋。 "echo `echo \`echo abc\``" 有效。
【解决方案2】:

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

$ echo "`echo \"test\" `"
test

$ echo "$(echo \"test\" )"
"test"

所以反引号会默默地删除双引号。

【讨论】:

  • 有趣的例子。我怀疑 $() 的内容是在外部字符串处理特殊字符之前运行的,而不是使用反引号的情况。如果您想使用反引号并保留引号,echo "`echo \\"test\\"`" 将起作用,因为需要对 bash 斜杠转义字符进行转义以进行外部字符串解析,以使其持续用于内部命令。
【解决方案3】:

${}指Shell参数扩展。手动链接:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

‘$’字符引入参数扩展,命令 替换或算术扩展。参数名称或符号 被扩展可以用大括号括起来,这是可选的,但用于 保护要立即从字符扩展的变量 在它后面可以解释为名称的一部分。

当使用大括号时,匹配的结束大括号是第一个'}'而不是 由反斜杠或在带引号的字符串中转义,而不是在 嵌入式算术扩展、命令替换或参数 展开。

FULLPATH=/usr/share/X11/test.conf_d/sk-synaptics.conf
 echo ${FULLPATH##*/}
echo ${FILENAME##*.}

第一个回显将获取文件名。第二个将根据手动 ${parameter##word} 部分获得文件扩展名。


$(command)

`command`

参考命令替换。

Bash 通过在子 shell 中执行命令来执行扩展 环境并用标准替换命令替换 命令的输出,删除所有尾随换行符。

https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html

【讨论】:

    猜你喜欢
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多