在unix中读取文件的区别

时间:2018-04-05 04:48:49

标签: bash unix

我的文件内容为

bash-4.4$ cat b.txt                                                                                                                       
unix unix                                                                                                                                 
unix                                                                                                                                      
unix unix unix                                                                                                                            
linux                                                                                                                                     
linux linux 

以下脚本使用for循环读取文件内容,使用while循环读取另一个脚本。但两者都以两种不同的方式打印内容。是什么原因?

#/usr/bin/bash                                                                                                                            

echo "for loop approach"                                                                                                                  
for i in $(cat b.txt)                                                                                                                     
do                                                                                                                                        
echo $i                                                                                                                                   
done                                                                                                                                      

echo ""                                                                                                                                   
echo "while approach"                                                                                                                     
cat b.txt | while read line                                                                                                               
do                                                                                                                                        
echo $line                                                                                                                                
done       

bash-4.4$ bash aa.bash                                                                                                                    
for loop approach                                                                                                                         
unix                                                                                                                                      
unix                                                                                                                                      
unix                                                                                                                                      
unix                                                                                                                                      
unix                                                                                                                                      
unix                                                                                                                                      
linux                                                                                                                                     
linux                                                                                                                                     
linux                                                                                                                                     

while approach                                                                                                                            
unix unix                                                                                                                                 
unix                                                                                                                                      
unix unix unix                                                                                                                            
linux                                                                                                                                     
linux linux  

1 个答案:

答案 0 :(得分:4)

在shell中,IFS字符出现在for变量的字符上:默认为空格,制表符和换行符。

$(cat b.txt)方法中,您没有引用命令替换IFS,因此会触发分词(和word splitting),导致单词被{{{{{{ 1}}作为输出中的单独实体。

使用while方法,read读取每一行(最多\n),这样您就可以在输出中获得整行。

使用带命令替换的for循环总是错误的方法,同时逐行读取文件。使用while循环代替read