バックティック(`)を理解する

バックティック(`)を理解する

コマンドを試しています

$ b=5; echo `$b`;
-bash: 5: command not found

ただし、期待どおりに5は印刷されません。私がここで何を見逃しているのでしょうか?

コマンドで `(バックティック/バックティック)とはどういう意味ですか?`その中に含まれるコマンドが評価され、出力に置き換えられると言われているようです。

答え1

バックティック間のテキストが実行され、コマンドの出力に置き換えられます(末尾の改行文字を除く、出力にNUL文字がある場合はシェルが異なる動作をすることを参照してください)。それはコマンドの置き換えコマンドの出力に置き換えられるからです。したがって、5を印刷するにはバックティックを使用できません。引用符を使用するecho "$b"か、引用符を削除してを使用できますecho $b

ご覧のように、5が含まれているため、$bbackticksを使用して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 ではトークン化のみ) と同様にトークン化およびファイル名生成の影響を受けるため、リストコンテキストで引用しなければならないことがよくあります。

答え2

バックティックは、あなたが言うものとまったく一致しています。変数を整数に設定しました。バックティック内に変数を入れると、bashはそれをコマンドとして実行しようとします。コマンドではないため、エラーが発生します。

あなたがしたいことは簡単です:

$ b=5; echo "$b"

バックティックをよりよく理解するには、以下を比較します。

$ b=5; a=`echo "$b"`; echo "$a"
5

答え3

行を段階的に見てみると説明になります。

$ b=5; echo `$b`;
  1. 変数をb5に設定
  2. 評価$b(効果的な操作5
  3. echo上記評価の結果です。

はい。結果は予想されます。実際のコマンドだと思うのではなく、変数の内容を評価しています。バックティック内に入力した内容はすべて、新しい(サブ)シェルで簡単に評価(実行)されます。

関連情報