コードをコピーしようとしています。ここ
何らかの理由で私のコンピュータでは動作しません。数値以外の出力はコマンド自体です。
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
runコマンドは変数の内容の一部である$x
ため、あなたの場合には機能します。echo
答え2
Haxielが指摘したように、バックティック文字ではなく一重引用符を使用する可能性が高くなります。しかし、`
私が推奨する逆引用符()を使用するよりも優れています$()
。バックティックは廃止され、$()
POSIX と互換性があります。
あなたの例では、次のことができます。
x=$(echo "var=500;var%=7;var" | bc)
echo "$x"
または1行で:
echo "var=500;var%=7;var" | bc