我想使用bash here doc语法来构建一个长字符串。我希望heredoc忽略换行符/空格/制表符,即使我使用换行符代码清晰。
我认为这样可行:
#!/bin/bash
#http://unix.stackexchange.com/questions/20035/how-to-add-newlines-into-variables-in-bash-script
IFS= read -r -d '' NS_LOG<<-EOF
*=error|warn|prefix_node|prefix_func
:PointToPointNetDevice
:ClockTest
:ClockPerfect
:TcpTestSuite
:TcpRxBuffer
:TcpTxBuffer
:TcpHeader=*
:TcpL4Protocol
:TraceHelper:PointToPointHelper
EOF
echo $NS_LOG
export NS_LOG
但在某处bash在行之间添加空格而不是具有所需的
*=error|warn|prefix_node|prefix_func:PointToPointNetDevice:ClockTest:ClockPerfect:Clock
我在运行$ ./launch_myscript.sh时有:
*=error|warn|prefix_node|prefix_func :PointToPointNetDevice :ClockTest :ClockPerfect :Clock etc...
我的bash --version:
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)
我刚刚在推荐的帖子中看到了这一个Bash: Why is echo adding extra space?。如何防止NS_LOG被视为多个参数?最终目标是输出该变量。
答案 0 :(得分:5)
您的read
命令非常明确地将换行视为数据:通过清除IFS并传递-d ''
,您告诉read
不要将空格字符视为特殊字符;因为它们并不特殊,所以它们像其他一样进入输出变量。但是,您可以稍后将其删除:
IFS= read -r -d '' NS_LOG <<'EOF'
...content...
EOF
NS_LOG=${NS_LOG//[[:space:]]/} ## replace all whitespace with the empty string
printf '%s\n' "$NS_LOG" ## the quotes are important!
在http://ideone.com/fWhzBB处查看此代码段运行及其输出。
注意:
<<'EOF'
防止在heredoc本身内发生扩展;使用<<EOF
,$foo
,$(foo)
等会很特别。<<-
仅修剪前导标签字符,而不修剪任何其他形式的空格;它通常更安全。echo $foo
string-splits和glob-expands $foo
的内容,将此进程创建的每个单词作为单独的参数传递; echo
然后在每个参数之间放置空格。 echo "$foo"
确保整个扩展被视为一个单词。见BashPitfalls #14。echo
使用printf
与非平凡或未知数据进行对比in the relevant portion of the POSIX specification; -e
是首选替代品。当内容包含反斜杠文字时,明确允许POSIX echo以未定义的方式运行,并且命令的BSD和AT&amp; T派生形式明显不兼容,彼此之间以及与公共GNU实现(提供{{1}标志,POSIX规范只需要在其输出上打印-e
。答案 1 :(得分:0)
var="`tr -d '[:space:] <<EOF'
your
text
with
lot of spaces
EOF`"
结果:
$ echo "$var"
yourtextwithlotofspaces