我有一个脚本需要动态组合另一个脚本以便以后执行,但是我遇到了被替换字符的问题,特别是任何被转义的问题,例如\\
,\t
,{{ 1}}等等。虽然我可以使用变量解决这个问题,但是它非常烦人,特别是因为代码是以引用形式包含在这里的文档中提供的,即 - 它们根本不应该被处理。
更令人讨厌的是,在某些平台上,这种替换似乎也扩展到了其他角色,例如\n
,这对我对正则表达式的测试造成了严重破坏。
这是一个简单的例子:
\1
我希望这会生成一个带有行#!/bin/sh
script=$(cat << 'SCRIPT'
#!/bin/sh
printf '\t%s' "$1"
SCRIPT
)
DIR=$(dirname "$PWD")
echo "$script" > "$DIR/test_script.sh"
的简单脚本,但是当预期没有替换时,该行会生成为printf '\t%s' "$1"
。
任何人都可以解释为什么会发生这种情况,理想情况下,如何防止这种情况发生?就像我说的,我可以用替换字符的变量解决这个问题,但它破坏了我的脚本的可读性(并且很难调试)。
答案 0 :(得分:3)
当您将脚本转储到文件时,您的echo
版本会出现一些转义字符。 echo
没有很好地标准化,因为任何标准都会与之前的某些实施相冲突。请改用printf
。
#!/bin/sh
script=$(cat << 'SCRIPT'
#!/bin/sh
printf '\t%s' "$1"
SCRIPT
)
DIR=$(dirname "$PWD")
printf "%s\n" "$script" > "$DIR/test_script.sh"