2016-06-29 251 views
9

我有一個變量FOO與我需要分配一個值將是多行。事情是這樣的,如何將一個多行值分配給一個bash變量

FOO="This is line 1 
    This is line 2 
    This is line 3" 

所以,當我打印的FOO價值也應該給下面的輸出。

echo $FOO 
output: 
This is line 1 
This is line 2 
This is line 3 

此外,線的數目將被動態地決定爲我將使用循環初始化它。

在另一個問題中主要使用read -d顯示的答案不適合我,因爲我正在執行密集的字符串操作,並且代碼格式也很重要。

+2

拆下通往空格:'回聲「$ FOO」' – Cyrus

回答

22

明智的話,不要縮進的行,否則你會得到額外的空間。當您擴展"$FOO"以確保保留新行時使用引號。

$ FOO="This is line 1 
This is line 2 
This is line 3" 
$ echo "$FOO" 
This is line 1 
This is line 2 
This is line 3 

另一種方法是使用\n轉義序列。它們被解釋爲$'...'字符串。

$ FOO=$'This is line 1\nThis is line 2\nThis is line 3' 
$ echo "$FOO" 

的第三種方式是存儲字符\n,然後有echo -e解釋轉義序列。這是一個微妙的差異。重要的部分是\n不在正規引號內解釋。

$ FOO='This is line 1\nThis is line 2\nThis is line 3' 
$ echo -e "$FOO" 
This is line 1 
This is line 2 
This is line 3 

你可以看到,如果你刪除-e選項,並有echo打印原始字符串而不用解釋什麼,我做了區分。在2號線和3使用

$ echo "$FOO" 
This is line 1\nThis is line 2\nThis is line 3 
+0

嗨,John,你的示例代碼適合我!但是,在上面的第一個例子中,當我用''echo $ FOO'''回顯變量而不在引號之間放置$ FOO時,輸出位於同一行。你知道爲什麼嗎?我在Ubuntu 14.04上使用GNU bash,版本4.3.11(1) - 發佈。 – yaobin

+0

這就是當你沒有報價時會發生什麼。該值受*分詞*和* glob擴展*的影響。不是'echo'被告知打印一個帶有嵌入換行符的參數,'$ FOO'的每個單詞都成爲一個不帶換行符的獨立參數。就好像你寫了'echo這是第一行這是第二行這是第三行'。底線:總是引用變量擴展,除非你真的希望它受到分詞和通配(罕見)的影響。 –

3

初始化FOO時,應該使用換行符:\n

FOO="This is line 1\nThis is line 2\nThis is line 3" 

然後使用echo -e輸出FOO

需要注意的是\n"..."沒有一個換行符是很重要的,但文字\,其次是文字n。僅當echo -e解釋爲該文字序列被轉換爲換行符時纔是。 - 從mklement0


#!/bin/bash 

FOO="This is line 1\nThis is line 2\nThis is line 3" 
echo -e $FOO 

Output: 
This is line 1 
This is line 2 
This is line 3 
+0

它給人輸出'-e這是1號線 這是2號線 這是行3' – juned

+0

感謝。它爲我工作。 – molecule

+2

@juned您需要支持'-e'的'echo'版本。 Bash的內置echo命令與GNU的'/ bin/echo'二進制文件一樣。 –

相關問題