Bashスクリプトでバックティックを使用したコマンド置換の奇妙な出力

Bashスクリプトでバックティックを使用したコマンド置換の奇妙な出力
echo "testing:"
PROXY_URL="/proxyurl/"
proxyUrlSedEscaped=`echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'`
echo                     "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'
echo "$proxyUrlSedEscaped"

echo "???"

上記の出力は次のとおりです。

testing:
\/proxyurl\/
&proxyurl&
???

最後のエコー出力が前のエコー出力と異なるのはなぜですか?

コマンドラインを介してコマンドが正しく実行されます: PROXY_URL="/proxyurl/"; echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'、出力:\/proxyurl\/

答え1

バッシュマニュアルによるとそしてPOSIX):

以前のスタイルのバックティック代替形式を使用している場合、バックスラッシュは後ろに$`または来ない限り文字通りの意味を維持します\

`echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'`これは、デュアルバックスラッシュが単一のバックスラッシュにエスケープされたためにコマンドが実行されたことを意味します。次に、sedでリテラルを生成します。sedsed -e 's/[\/&]/\&/g'\&&

$(...)-styleコマンド置換を使用すると、これを防ぐことができます。

proxyUrlSedEscaped=$(echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g')

新しいスタイルの置き換えにより、すべてのコマンドが一般的な解釈を持つことができます。

使用する必要がある場合は、`多少奇妙な二重エスケープも機能します。

proxyUrlSedEscaped=`echo "$PROXY_URL" | sed -e 's/[\/&]/\\\\&/g'`

それはなり\\\\\\次にsedがあなたのものになります\

関連情報