我想在这里使用bash 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
Run Code Online (Sandbox Code Playgroud)
但在某处bash在行之间添加空格,而不是所需的
*=error|warn|prefix_node|prefix_func:PointToPointNetDevice:ClockTest:ClockPerfect:Clock
Run Code Online (Sandbox Code Playgroud)
我在运行$ ./launch_myscript.sh时有:
*=error|warn|prefix_node|prefix_func :PointToPointNetDevice :ClockTest :ClockPerfect :Clock etc...
Run Code Online (Sandbox Code Playgroud)
我的bash --version:
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)
Run Code Online (Sandbox Code Playgroud)
我只是在推荐的帖子中看到了这一Bash:为什么回声会增加额外的空间?。如何防止将NS_LOG视为多个参数?最终目标是导出该变量。
您的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!
Run Code Online (Sandbox Code Playgroud)
在http://ideone.com/fWhzBB上查看此代码段运行及其输出。
笔记:
<<'EOF'防止在Heredoc内部进行扩展;有<<EOF,$foo,$(foo),等会是特殊的。<<-仅修剪前导制表符,不修剪任何其他形式的空格;没有它通常更安全。echo $foo字符串拆分和glob-expand扩展的内容$foo,并将此过程创建的每个单词作为单独的参数传递;echo然后在每个参数之间放置空格。echo "$foo"确保将整个扩展视为一个单词。参见BashPitfalls#14。echo建议在POSIX规范的相关部分中使用不重要或未知的数据; printf是首选替代品。当内容包含反斜杠文字时,POSIX回显被明确允许以未定义的方式运行,并且该命令的BSD和AT&T派生形式显式地彼此不兼容,并且与通用GNU实现不兼容(提供一个-e标志,POSIX spec要求仅-e在其输出上打印)。