88

私がこの質問に答えたとき、私は${}記法を使用するつもりでした.

しかし、私が試したとき

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

メッセージを受け取りました

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

しかし

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

正常に動作します。では、他にどのような変更を加える必要がありますか?

4

3 に答える 3

131

これはコマンド置換と呼ばれ、(中括弧)を使用している場合は (括弧)`` と同等です。$()${}

したがって、これらの式はすべて等しく、「内部に配置されたコマンドを解釈する」ことを意味します。

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

while${}式は変数置換に使用されます。

ただし、バッククォートは推奨されていませんが、$()POSIX と互換性があるため、後者を優先する必要があります。


からman bash:

コマンド置換を使用すると、コマンドの出力をコマンド名に置き換えることができます。次の 2 つの形式があります。

          $(command)
   or
          `command`

また、``扱いがより難しく、たとえば、それらをネストすることはできません。以下のコメントと、 (バックティック)より $(...) が優先される理由も参照してください。....

于 2014-03-28T09:56:31.067 に答える
38

特定のケースでは、動作がわずかに異なります。

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

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

したがって、バッククォートはサイレントに二重引用符を削除します。

于 2016-05-02T08:53:31.283 に答える