質問は〜です。いいえ正しくエスケープされた文字列リテラルを作成する方法について説明します。スクリプトや他のプログラムで直接使用するために変数をエスケープする方法に関連しない質問はありません。
私の目標は、あるスクリプトが別のスクリプトを生成できるようにすることです。これは、生成されたスクリプトの作業範囲が0からN別のコンピュータで複数回実行すると、それを生成するデータが再実行される前に変更される可能性があるため、ネットワーク経由で直接実行することは機能しません。
特殊文字(一重引用符など)を含むことができる既知の変数がある場合は、完全にエスケープされた文字列リテラルとして作成する必要があります。たとえば、foo
含まれる変数は、bar'baz
生成されたスクリプトに次のように表示されます。
qux='bar'\''baz'
これは"qux=$foo_esc"
スクリプトに追加の行を追加することによって作成されます。私はPerlを使って次のようにしました。
foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'"
しかし、これはあまりにも過度のようです。
私は成功せずにbashを単独で使用しました。私は次のようなさまざまなバリエーションを試しました。
foo_esc="'${file//\'/\'\\\'\'}'"
foo_esc="'${file//\'/'\\''}'"
ただし、追加のスラッシュが出力に表示されるか(これを実行するとecho "$foo"
)、構文エラーが発生します(シェルで実行した場合は追加の入力が期待されます)。
ベストアンサー1
Bashには、このような状況のパラメータ拡張オプションがあります。:
${parameter@Q}
拡張子は、値が次のような文字列です。範囲入力として再利用できる形式で引用してください。
したがって、この場合:
foo_esc="${foo@Q}"
Bash 4.4以降はこの機能をサポートしています。他の形式の拡張、特に完全な割り当てステートメントを生成するためのさまざまなオプションがあります()@A
。