只要不存在终端反斜杠,在变量中捕获heredoc的输出后,就会保留heredoc的换行符:
var=$(cat <<-EOF
a
b
c
EOF
)
echo "$var"
a
b
c
但是,当尝试存储反斜杠换行符时,换行符会丢失:
var=$(cat <<-EOF
a \\
b \\
c
EOF
)
echo "$var"
a \b \c
添加额外的反斜杠以进一步转义并没有帮助。
当然,当不在子shell中运行时,可以使用heredoc生成以反斜杠换行符结尾的行:
$ cat <<-EOF
a \\
b \\
c
EOF
a \
b \
c
为了避免这个问题,可以添加一个换行符来通过变量的转换来生成所需的输出:
var=$(cat <<-EOF
a \\@
b \\@
c
EOF
)
tr -d '@' <<<"$var"
a \
b \
c
有没有更直接的方法来保留在子外壳中运行的 heredocs 中的反斜杠换行符?
我想知道这是否是 Bash 中的错误(或者反斜杠换行符的行为是否只是未定义)。我尝试过的所有其他 shell 都显示出与 Bash 不同的行为:
输出:
对比
您可以将代码放在函数中的命令替换中,这可能有助于解决解析器的任何问题,例如:
没有直接的方法可以在 here-doc 中强制扩展换行符。但是您可以使用包含编码换行符的变量,使用 ANSI 转义序列 (
$'\n'
) 并使变量扩展发生在 heredoc 内。请注意,这种形式的 hereodoc 扩展需要您的分隔符
'EOF'
不被引用,即如下所示,并将
$nl
变量用作换行符的占位符现在正确发出