带有以斜线结尾的行的多行字符串

时间:2017-06-27 22:25:16

标签: bash shell scripting

我正在尝试干净地创建一个包含反斜杠和变量替换的多行字符串。最初,我不需要反斜杠,并且能够通过这个片段实现我所需要的:

            description=$(cat <<EOF
Creation time: $(date)
Creator: $test_group_creator
Test group: $test_group
Test execution: $test_execution_id - $test_name
Adapter: $initiator1_mac_addr

http://...
EOF
)

它并不理想,因为它最终看起来有点笨拙并要求我打破代码的缩进级别,但它非常清楚并且代表了描述在以后的网页上的显示方式。 (我知道&lt;&lt; -EOF语法,但我们在代码中使用4空格缩进,并且该语法需要制表符。)以下是变量回显:

Creation time: Tue Jun 27 15:22:27 PDT 2017
Creator: langlorx
Test group: all
Test execution: 13 - go
Adapter: eth0

link...

然而,最近,该文本也被放入Wiki解析器中,现在换行符被折叠到一个空格。要强制换行中段,该行必须以双反斜杠结尾。知道bash特意处理反斜杠,我知道我必须加倍双反斜杠,但它仍然没有正确。使用这个:

            description=$(cat <<EOF
Creation time: $(date)\\\\
Creator: $test_group_creator\\\\
Test group: $test_group\\\\
Test execution: $test_execution_id - $test_name\\\\
Adapter: $initiator1_mac_addr\\\\

http://...
EOF
)

我发现新行在结果变量中完全消失,并且在空行之前的最后一个序列导致变量中的单个反斜杠,空行完全消失。没有任何反斜杠,结果字符串完全如上面所示,带有换行符,空行和变量替换。一旦我在一行的末尾包含任何反斜杠,它就会在bash中触发一组不同的规则来编码变量。

Creation time: Tue Jun 27 15:20:17 PDT 2017\\Creator: user\\Test group: all\\Test execution: 12 - go\\Adapter: eth0\link...

有没有更好的方法在bash中执行此操作而不是尝试滥用cat和命令替换,同时仍然使代码有点干净?

1 个答案:

答案 0 :(得分:1)

以您想要的格式存储数据,然后根据需要进行后处理。如果您想忽略前导空格并将\\附加到每一行,请执行以下操作:

embed() { sed -e 's/^ *//; s/$/\\\\/'; }

description=$(embed << eof
    Creation time: $(date)
    Creator: foo
    Test group: bar
    etc
eof
)

printf '%s\n' "$description"

会给你:

Creation time: Tue Jun 27 15:33:31 PDT 2017\\
Creator: foo\\
Test group: bar\\
etc\\