私はコマンドを試しています
$ b=5; echo `$b`;
-bash: 5: command not found
ただし、想定どおり5は出力されません。ここに何が欠けていますか?
コマンドで `(バッククォート/バックティック)はどういう意味ですか?`
内のコマンドを評価し、それらを出力に置き換えると言っているようです。
私はコマンドを試しています
$ b=5; echo `$b`;
-bash: 5: command not found
ただし、想定どおり5は出力されません。ここに何が欠けていますか?
コマンドで `(バッククォート/バックティック)はどういう意味ですか?`
内のコマンドを評価し、それらを出力に置き換えると言っているようです。
回答:
バッククォート間のテキストは実行され、コマンドの出力に置き換えられます(末尾の改行文字を除く。出力にNUL文字があるとシェルの動作が異なることに注意してください)。これは、コマンドの出力で置換されるため、コマンド置換と呼ばれます。したがって、5を印刷する場合は、逆引用符を使用できません。echo "$b"
引用符を使用できますecho $b
。
ご覧のとおり、$b
5が含まれているので、backticksを使用bash
するとコマンドを実行しようとし5
、そのようなコマンドがないため、エラーメッセージで失敗します。
バックティックの動作を理解するには、これを実行してみてください:
$ A=`cat /etc/passwd | head -n1`
$ echo "$A"
cat /etc/passwd |head -n1
/etc/passwd
ファイルの最初の行を印刷する必要があります。しかし、バックティックを使用しているため、コンソールにこれを印刷しません。代わりに、A
変数に保存されます。$A
これにエコーできます。最初の行を印刷するより効率的な方法はコマンドを使用head -n1 /etc/passwd
することですが、バックティック内の式は単純である必要はないことを指摘したかったことに注意してください。
したがって、/ etc / passwdの最初の行がの場合root:x:0:0:root:/root:/bin/bash
、最初のコマンドはbashによって動的に置き換えられA="root:x:0:0:root:/root:/bin/bash"
ます。
この構文はBourneシェルのものであることに注意してください。引用とエスケープは、特にネストを開始した場合、すぐに悪夢になります。Ksh $(...)
は、現在標準化され(POSIX)、すべてのシェル(Unix v9のBourneシェルも含む)でサポートされている代替を導入しました。したがって$(...)
、非常に古いBourneシェルに移植する必要がない限り、今日では代わりに使用する必要があります。
また、との出力は`...`
、$(...)
変数展開(zshでの単語分割のみ)と同様に、単語分割とファイル名生成の対象となるため、通常、リストコンテキストで引用符で囲む必要があります。
you can use quotation marks, like echo "$b"
=> ""は特別なことをしますか?そうですecho $b
、同じようにうまくいくでしょう。
echo
ておらず、コマンドが取得する引数の数を気にしないため、b
内部にスペースがある場合、複数の引数を取得し、それらを引き続き出力するためです。これは他のコマンドには当てはまらない可能性があります(特に変数が設定されていない場合)ので、私は常に変数を引用符で囲む傾向があります。
(POSIX)
実際の標準へのリンクであればいいでしょう。
行ごとに説明する必要があります。
$ b=5; echo `$b`;
b
を5に設定します$b
(効果的に実行する5
)echo
上記の評価の出力。そう、あなたが得た出力は期待されています。あなたが思っていた実際のコマンドではなく、変数の内容を評価しています。バックティック内に入れたものはすべて、新しい(サブ)シェルで単純に評価(実行)されます。