2016-06-08 104 views
1

在這裏,我想在bash申報多線值的變量:定界符不保留空白行

$ GET="$(cat <<EOF 
> GET/HTTP/1.1 
> Host: 127.0.0.1:80 
> 
> EOF 
>)" 

這在文檔的結束是肯定的,但是空行工作失去了,

$ echo "$GET" 
GET/HTTP/1.1 
Host: 127.0.0.1:80 
$ cat <<< "$GET" 
GET/HTTP/1.1 
Host: 127.0.0.1:80 

回答

2

它實際上不是修剪尾隨換行符的heredoc,而是命令替換。考慮使用read代替:

$ IFS= read -r -d '' var << EOF 
> hello 
> world 
> 
> EOF 
$ printf "%s" "$var" 
    hello 
world 

$ 

注意printf通常不會打印換行符,所以變量var實際上有兩個尾隨換行符。

替代可以簡單地使用多行字符串:

var=" hello 
world 
" 
+0

更正確的答案++ – anubhava

+0

爲什麼很重要設置'IFS'到'null'? –

+0

@NarūnasK請參閱:https://unix.stackexchange.com/questions/18886/why-is-while-ifs-read-used-so-often-instead-of-ifs-while-read。在你的情況下,它可以適當地省略。 – andlrc

1

命令替換$()當分配給變量自動刪除後的新行。
所以你需要一個更多的工作用定界符在你的代碼是這樣

$ GET=$(cat <<EOF 
GET/HTTP/1.1 
Host: 127.0.0.1:80 

. # end with period for preserve trailing newlines 
EOF 
) 

$ GET=${GET%.} # remove period