意外的字符替换

时间:2014-07-18 14:53:10

标签: linux shell

我有一个脚本需要动态组合另一个脚本以便以后执行,但是我遇到了被替换字符的问题,特别是任何被转义的问题,例如\\\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"

任何人都可以解释为什么会发生这种情况,理想情况下,如何防止这种情况发生?就像我说的,我可以用替换字符的变量解决这个问题,但它破坏了我的脚本的可读性(并且很难调试)。

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"