这个问题不是关于如何编写正确转义的字符串文字。我找不到任何与如何转义变量以在脚本或其他程序中直接使用的相关问题。
我的目标是使脚本能够生成其他脚本。这是因为生成的脚本中的任务将在另一台机器上运行 0 到n次,并且生成它们的数据在运行(再次)之前可能会发生变化,因此直接通过网络执行操作将不行。
给定一个可能包含特殊字符(例如单引号)的已知变量,我需要将其写为完全转义的字符串文字,例如,foo
包含的变量bar'baz
应出现在生成的脚本中:
qux='bar'\''baz'
Run Code Online (Sandbox Code Playgroud)
这将通过附加"qux=$foo_esc"
到其他脚本行来编写。我是这样使用 Perl 做到的:
foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'"
Run Code Online (Sandbox Code Playgroud)
但这似乎有点矫枉过正。
我单独使用 bash 没有成功。我已经尝试了这些的许多变体:
foo_esc="'${file//\'/\'\\\'\'}'"
foo_esc="'${file//\'/'\\''}'"
Run Code Online (Sandbox Code Playgroud)
但是输出中会出现额外的斜杠(当我这样做时echo "$foo"
),或者它们会导致语法错误(如果从 shell 完成,则需要进一步的输入)。