2011-10-31 120 views
4

我在網上搜索關於這個問題,我發現兩種方法至今:如何從bash腳本中的文件逐行讀取?

while read line; do 
     commands 
    done < "$filename" 

for $line in $(cat $filename); do 
     commands 
    done 

沒有這些工作,如果行有一個空間,雖然,例如,如果我們有這樣的

textextext text 

線不會打印textextext text

textextext 
    text 

它計數這些東西爲不同的線路,我如何才能避免這種情況發生?

+0

您對以下內容感興趣a)引導和尾隨空格或b)中間空格(例如,多個空格)或c)只在一行中的單詞中? –

回答

9

是否這樣?

while IFS= read line ; do 
    something "$line" 
done <"$file" 

下面是一個簡單的測試:

while IFS= read line ; do echo "$line"; done <<<"$(echo -e "a b\nc d")" 
a b 
c d 
+0

是不是我發佈的同樣的東西? 我認爲這不會工作,如果該行有空間 – jonathan

+0

你注意到'IFS ='? –

+1

是的,它有什麼作用?我試過了,但我得到了相同的結果 – jonathan

6

您可以readarray(慶典4+)

readarray lines < "$file" 

然後

for line in "${lines[@]}"; 
do 
    echo "$line" 
done 

注意,默認情況readarray會甚至包括該行每行的末尾字符

+1

readarray的「-t」arg將「從每行讀取的尾部換行刪除」。 –