bashパラメータの拡張は、単純なテキスト置換よりも多いようです。

bashパラメータの拡張は、単純なテキスト置換よりも多いようです。

私はbashが"$<var>"単に。次の対話を考えます。$<var><var>

1: $ X="A; B"
2: $ printf "%s\n" $X
3: A;
4: B
5: $ printf "%s\n" "A; B"
6: A; B
7: $ printf "%s\n" A; B
8: A
9: B: command not found

ご覧のとおり、2行の出力は5行の出力と異なるため、この場合の拡張は$X単純なテキスト置換ではありません。二重引用符(7行)を削除しても効果はありません。

bashがこれらの状況を正確にどのように処理するかを説明できますか?

ベストアンサー1

引用しなかったため、言葉で表現された可能性があり$Xます。行2で実行されたコマンドは次のとおりです。

printf '%s\n' 'A;' B

シェルは;エスケープされますが、スペースはエスケープされません。これは7行目のコマンドとは異なります。

$ printf "%s\n" A; B

エスケープされないため、;コマンド区切り文字として機能します。つまり、次のコマンドはBコマンドではないため、コマンドが見つからないというエラーが発生します。

5行目は二重引用符のために期待どおりに機能し、2行目にも二重引用符が必要です。単語の分割を防ぎます。必要なコマンドは次のとおりです。

printf "%s\n" "$X"

おすすめ記事