我想将此命令放入一个文件中以便稍后运行:
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) 是好的,但是是 Bashism。看起来最好的选择是使用 (1) 或 (2) 并转义变量中的任何双引号,但这可以通过其他方式完成吗?
我认为这是安全的:
它对字符串进行单引号,因此输入字符串中的任何
$
,`
,\
, and"
都无关紧要,并将任何现有'
字符转换为'"'"'
(即结束单引号,双引号一个单独的单引号,然后重新输入单引号)。$(...)
在那里使用命令替换很诱人,除了它会吃掉输入中的任何尾随换行符。相反,开始和结束引号由第二个和第三个sed
脚本本身插入,在第一行的开头和最后一行的结尾。任何嵌入的换行符都是原始的,这很好。输出适合复制回 shell,即使在我可以发明的最病态的情况下(首先使用Bash ANSI-C 引用
$'...'
来创建测试字符串,但不是之后):将其放入变量中是安全的
xr=$(esc "$xr")
,然后稍后在您的此处文档或其他地方进行普通替换。