Unix中for循环与while循环读取文件的输出差异原因咨询
为什么for循环和while循环读取文件内容的输出形式不同?
咱们拆解下两种循环的工作逻辑,就能明白差异的根源了:
1. for循环的工作方式
当你写for i in $(cat b.txt)时,$(cat b.txt)会先把b.txt的内容完整输出——也就是那一行连续的unix unix ... linux linux linux。
接下来Shell会对这个输出做自动分词处理:默认情况下,Shell会把空格、制表符、换行符都当成“分隔符”(这个规则由环境变量IFS控制,默认值就是这几个字符),把整个内容拆成一个一个独立的单词。
所以for循环会逐个遍历这些拆分后的单词,每次循环里i就代表一个单词,echo $i自然就把每个单词单独打印一行,最终呈现的就是每个unix、linux各占一行的结果。
2. while循环的工作方式
而cat b.txt | while read line的逻辑完全不同:这里的read line命令是专门按行来读取输入的。
read命令默认会一直读取输入,直到遇到换行符为止,然后把这一整行的内容全部赋值给变量line。你的b.txt里只有一行内容,所以read一次性就把整行的unix unix ... linux linux linux都读进line里,echo $line也就直接把整行内容打印出来了。
一句话总结
- for循环是按单词遍历,依赖Shell的分词规则拆分内容
- while+read是按行读取,每次获取一整行的内容
内容的提问来源于stack exchange,提问作者Dileep Dominic
相关产品推荐
相关产品推荐

