我正在尝试干净地创建一个包含反斜杠和变量替换的多行字符串。最初,我不需要反斜杠,并且能够通过这个片段实现我所需要的:
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和命令替换,同时仍然使代码有点干净?
答案 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\\