
私は以下のコードを再現しようとしていますここ
何らかの理由で、私のコンピュータでは動作しません。数値ではなく、出力がコマンドそのものです。
apple$ x='echo "var=500;var%=7;var"|bc'
apple$ $x
"var=500;var%=7;var"|bc
なぜそうなるのか知りたいです。何が間違っていたのでしょうか?
答え1
ソース`
では、コマンドの置換を示すためにバックティック ( ) を使用しています。バックティック内に指定されたコマンドが実行され、その結果がその場所に配置されます。この場合、単純な変数の割り当てであるため、コマンドの結果が変数に割り当てられます。
-x
これは、bash のオプションを使用すると簡単に確認できます。
$ x=`echo "var=500;var%=7;var"|bc`
++ echo 'var=500;var%=7;var'
++ bc
+ x=3
バックティック文字の代わりに、一重引用符を使用しています。一重引用符は、シェルにリテラル値を保持し、その内容にいかなる処理も適用しないように指示します。その結果、コマンドはそのまま変数に割り当てられます。対応する-x
出力は次のとおりです。
$ x='echo "var=500;var%=7;var"|bc'
+ x='echo "var=500;var%=7;var"|bc'
最後に、変数の内容を出力するには、echo
または を使用する必要がありますprintf
。 'x' の値が 3 の場合、 を実行するとエラー メッセージ$x
が表示されます-bash: 3: command not found
。 実行が機能したのは、コマンドが変数の内容の一部であった$x
ためです。echo
答え2
Haxiel が指摘したように、バックティック文字の代わりに、おそらく一重引用符が使用されています。ただし、バックティック ( ) を使用するよりも、`
を使用することをお勧めします$()
。バックティックは非推奨であり、$()
POSIX と互換性があります。
あなたの例では、次のようにすることができます:
x=$(echo "var=500;var%=7;var" | bc)
echo "$x"
あるいは、ワンライナーで言うと:
echo "var=500;var%=7;var" | bc