2016-09-21 47 views
8

如果我有一個變量,其中有多行(文本),我怎麼才能得到最後一行?Bash從變量中獲取最後一行

我已經想通了如何獲取的第一行:

STRING="This is a 
multiple line 
variable test" 
FIRST_LINE=(${STRING[@]}) 
echo "$FIRST_LINE" 

# output: 
"This is a" 

大概應該有最後一行的運營商。或者至少我認爲,因爲@第一條線出來。

+2

你的腳本輸出只是變量(This)的第一個字,而不是所有的行。 –

+0

哦,沒有得到。也許因爲在我的用例中,第一行只有一個單詞。 * phew * –

+0

如果你需要做這樣的操作,不要將行存儲在一個字符串中,而是存儲在一個數組中! –

回答

10

使用bash字符串操作:

$> str="This is a 
multiple line 
variable test" 

$> echo "${str##*$'\n'}" 
variable test 

${str##*$'\n'}會從字符串的開頭這樣只留下刪除最長匹配,直到\n輸入中的最後一行。

+2

再次,在十秒內毆打! – Inian

+1

哇。我認爲@ redneb的答案對我來說看起來更簡單或者更優雅,但是這個作品很有用,而且可能是「正確」的做法。謝謝 –

+1

@MattBackslash:如果你正在尋找更便攜的方式,這是一個正確的選擇,可能適用於所有shell變種 – Inian

11

一個簡單的方法來做到這一點是使用tail

echo "$STRING" | tail -n1 
1

如果你想與STRING每行一個元素的數組,使用

readarray -t lines <<< "$STRING" 

然後,第一行是${lines[0]},最後一行是${lines[-1]}。在舊版本的bash中,不允許使用負數索引,您必須手動計算最後一個索引:${lines[${#lines[@]}-1]}

+1

一個小紙條可能表明需要'bash 4.x'? – Inian

+0

IMO,3.x應該被視爲與'dash'相媲美的兼容POSIX的外殼,但具有更好的交互功能。我認爲現在將近6年的「bash」4.2發佈了一個合理的基準假設。 – chepner

+0

仍然使用'GNU bash,版本4.1.2'順便說一句:),其中不支持。 :(我認爲可以添加一個適當的參考 – Inian