bashスクリプトでecho `echo \\\\\\z`コマンドが\\zの代わりに\\zを印刷するのはなぜですか?

bashスクリプトでecho `echo \\\\\\z`コマンドが\\zの代わりに\\zを印刷するのはなぜですか?

注文する

echo `echo \\\\\\\z`

~からこの本、なぜ印刷されるのかわかりません。

\\z

bashスクリプトを介して実行されたとき。

印刷すればいいと思います。

\\\z

ベストアンサー1

バックティックはバックスラッシュの二重処理を効果的に提供します。 (注コマンドライン処理時は1回、コマンド置換コマンド処理時は1回)

Kusalandaが言ったように、これは$(..)コマンドの置き換えとは異なります。

echoまず、基本的にバックスラッシュエスケープを基本的に処理しない Bashについて話しているようです。たとえば、whichはwhich printsにecho '\\'渡されます。バックスラッシュ自体を処理する機能(Bash with Dashやzshなど)を使用すると、最後のバックスラッシュが出力されます。\\echo\\echoshopt -s xpg_echo\\\\z


Bashのマニュアルによると:

以前のスタイルのバックティック代替フォーマットを使用する場合、バックスラッシュは、後に「ドル記号、バックティックまたはバックスラッシュ」が続かない限り、文字通りの意味を維持します。

だからコマンドで

echo `echo \\\\\\\z`      # 7 backslashes

ペアは\\最初に単一\sに縮小され、\zそのまま残ります\z(3つのうちどれも後に来ないため、バックスラッシュは文字通りです)。その後、バックティック内のコマンドはシェルを再実行します。

したがって、コマンド置換コマンドは最終的に次のようになります。

echo \\\\z                 # 4 backslashes

ここで\\ペアは単一の\sに縮小され、引数は次のechoとおりです\\z(2つのsを介して変更されていない状態で印刷するecho、上記の警告を参照)。

ドル記号を使用しても同様の結果が表示されます。たとえば、次のようになります。

var=foo
echo `echo \$var`

印刷foo

POSIXには奇妙な一重引用符の例もあります。:

echo `echo '\$x'`

印刷$x。 (一重引用符は保護されていません$。)


より合理的な形式のコマンド置換は、$(...)その内容が一度だけ処理されるということです。

echo $(echo \\\\\\\z)           # 7 backslashes

(3)を印刷\\\zし、

var=foo
echo $(echo \$var)

印刷$var

また見なさい:

おすすめ記事