2011-10-31 122 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将“从每行读取的尾部换行删除”。 –