首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >unix中读取文件的差异

问unix中读取文件的差异
EN

Stack Overflow用户
提问于 2018-04-05 12:48:49
回答 1查看 52关注 0票数 1

我的文件内容是

代码语言:javascript
复制
bash-4.4$ cat b.txt                                                                                                                       
unix unix                                                                                                                                 
unix                                                                                                                                      
unix unix unix                                                                                                                            
linux                                                                                                                                     
linux linux 

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

代码语言:javascript
复制
#/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  
EN

回答 1

Stack Overflow用户

发布于 2018-04-05 12:53:53

在shell中,缺省情况下,word splitting出现在IFS变量的字符上:空格、制表符和换行符。

在您的for方法中,您没有引用命令替换$(cat b.txt),因此将触发单词拆分(和pathname expansion),从而导致单词在输出中由IFS的那些字符分隔为单独的实体。

使用while方法时,read读取每一整行(直到\n),因此您将在输出中获得整行。

逐行读取文件时,使用带有命令替换的for循环始终是错误的方法。改用带有read的while循环。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49664356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档