この質問は、適切にエスケープされた文字列リテラルの書き方に関するものではありません。スクリプト内または他のプログラムで直接使用するために変数をエスケープする方法に関するものではない関連する質問は見つかりませんでした。
私の目標は、スクリプトが他のスクリプトを生成できるようにすることです。これは、生成されたスクリプト内のタスクが別のマシン上で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"
)、構文エラーが発生します(シェルから実行された場合、さらに入力が必要になります)。
alias "varname=$varname" varname
またはvar=value set
alias
および/またはset
かなり普遍的に