エスケープなしで文字列置換にアンパサンド(&)を使用できないのはなぜですか?

エスケープなしで文字列置換にアンパサンド(&)を使用できないのはなぜですか?

以下のスクリプトはとても簡単です。&次に変えてください&

string="Foo & Bar"
echo "${string//&/&}";

しかし、スクリプトは何もしません。エラーメッセージはなく、何も置き換えられません。

Foo & Bar

ついに解決策を見つけました。交換部品からアンパサンドをエスケープする必要があります。

string="Foo & Bar"
echo "${string//&/\&}";

私がまだ把握していないのはなぜ?スクリプトが期待どおりに機能しないのはなぜですか?なぜ最初の記号(例えば${string//\&/\&})ではなく最後の&記号だけをエスケープする必要があるのですか?

これは&記号が特別な意味を持つか、文字列の置換に使用されることを意味しますか?

答え1

ここでは、&一致するパターンを表します。:

patsub_replacementシェルを有効にするオプションを使用している場合は、引用符で囲まれていshoptない&インスタンスひも一致する部品に置き換えられます。模様。これは一般的なsedイディオムを繰り返すことです。

拡張機能がエスケープされない場合は、最終的には&「」自体に置き換えられます。

この機能はBash 5.2に追加されました

関連情報