変数から二重引用符をエスケープする

変数から二重引用符をエスケープする

後で実行できるように、このコマンドをファイルに保存したいと思います。

ln -s "$xr"/ya.txt ~

(1)を使ってこれを行うことができます。

cat > zu.sh <<eof
ln -s "$xr"/ya.txt ~
eof

または(2):

printf 'ln -s "%s"/ya.txt ~\n' "$xr" > zu.sh

または(3):

echo "ln -s '$xr'/ya.txt ~" > zu.sh

または(4):

printf 'ln -s %q/ya.txt ~\n' "$xr" > zu.sh

または(5):

printf 'ln -s "%s"/ya.txt ~\n' "${xr//\"/\\\"}"

しかし、すべてのソリューションに問題があります。 (1)または(2)の変数に二重引用符が含まれている場合は失敗し、(3)の変数に一重引用符が含まれていると失敗します。 (4) いいけどそうではないPOSIXで定義。 (5)とても良いですが、しかし バシズム。最良のオプションは(1)または(2)を使用して変数の二重引用符をエスケープするようですが、他の方法で実行できますか?

ベストアンサー1

私はこれが安全だと思います:

esc() {
    printf "%s\n" "$1" | sed -e "s/'/'\"'\"'/g" -e "1s/^/'/" -e "\$s/\$/'/"
}

それ一重引用符で囲まれた文字列なので、入力文字列の、、、および$は重要ではありません。`\"、既存の'文字を次のように変換します'"'"'(たとえば、末尾の一重引用符、二重引用符、一重引用符のみを使用してから二重引用符など)。

とても使いたいです$(...)コマンドの置き換えただし、入力から末尾の改行文字を食べる場合は除外されます。代わりに、2番目と3番目の引用符は、開いている引用符と閉じる引用符を挿入します。sed最初の行の先頭と最後の行の終わりにあるスクリプト自体。埋め込まれた改行は元の状態のままであるため大丈夫です。

出力は、私が考案できる最も病理的であってもシェルにコピーするのに適しています(使用バッシュANSI-C引用$'...'テスト文字列を最初に生成し、後で生成しない):

bash-4.4$ esc $'abc\ndef ghi\'jkl$mno`pqr\\stu\\\'vwx\n\n\n'
'abc
def ghi'"'"'jkl$mno`pqr\stu\'"'"'vwx


'
bash-4.4$ echo 'abc
> def ghi'"'"'jkl$mno`pqr\stu\'"'"'vwx
>
>
> '
abc
def ghi'jkl$mno`pqr\stu\'vwx



bash-4.4$ dash
$ echo 'abc
def ghi'"'"'jkl$mno`pqr\stu\'"'"'vwx


'> > > >
abc
def ghi'jkl$mno`pqr\stu\'vwx



$

変数に入れてxr=$(esc "$xr")から、ここのドキュメントや他の場所で一般的な置換に使用するのは安全です。

おすすめ記事