2012-08-10 102 views

回答

21

考慮以下的多行可變

x=$(echo -e "a\nb\nc d e") 

和每行一個簡單的過程:只是echo將其與前綴= LINE:並與周圍的線單引號。無論以下代碼將滿足該要求:

while read line; do echo "LINE: '${line}'"; done <<< "$x" 

while read line; do echo "LINE: '${line}'"; done < <(echo "$x") 

無論是創建一個子shell(這樣你就可以,例如,被設置在循環變量和訪問他們的它之外),和兩個輸出

LINE: 'a' 
LINE: 'b' 
LINE: 'c d e' 

但是假設,而不是你有

x=$(echo -e "a \n b\nc d e") 
# note--------^--^ 

以及您的應用程序的前導和尾隨空白問題(例如,解析Git瓷器)。上述代碼將爲後者的變量/數據提供與前者完全相同的輸出,這不是您想要的。爲了保留前導和後綴空格,請將while read line替換爲while IFS= read -r line。即,無論是以下代碼

while IFS= read -r line; do echo "LINE: '${line}'"; done <<< "$x" 

while IFS= read -r line; do echo "LINE: '${line}'"; done < <(echo "$x") 

會產生

LINE: 'a ' 
LINE: ' b' 
LINE: 'c d e' 

詳見Greg Wooledge's excellent Bash FAQ

+0

這是一個完美的解決方案,只是好奇,爲什麼不只是x =「a \ nb \ nc d e」? – 2012-08-10 13:13:56

+0

@SenthilKumar,該字符串包含10個字符:'a','\','n','b'等。「\ n」在雙引號內不是特殊的。在bash中,可以寫'$「a \ nb \ nc d e」'來在字符串中嵌入真正的換行符。 「-e」標誌告訴'echo'處理「\ n」作爲新行,而不是兩個單獨的字符。 – chepner 2012-08-10 13:23:32

+0

@chepner:thx,'$'對我來說是新的,但它可以用單引號'$'a \ nb \ nc d e'' – 2012-08-10 14:02:41

1

雖然我通常使用「while read」來處理多行變量,但我最近有一個實例,它從文件的每一行中刪除了前導空格。使用此代替固定我的問題:

printf %s "$var" | while IFS= read -r line 
do 
    echo "$line" 
done 

代碼取自this Unix Stack Exchange answer

相關問題