shell中使用for和while读取文件内容时候的区别
区别
-
使用while循环读取文件内容时,是按行读取的,每次读取一行数据,并将读取的内容赋予给变量; 而使用for循环读取文件内容时候,默认是按单词读取的,每次读取一个单词,并将读取的内容赋予给变量;
也可以这样理解,while读取文件内容时,是按 ‘换行符’ 作为;而for读取文件内容时,默认情况下(在for循环中,可以人为指定分隔符IFS变量的值,而while中不行),是按空格或空白符(空格、tab、换行符等)作为分隔符。
实验
有个文件file.txt,内容如下:
[root@slave3 ~]# cat file.txt hello world my first name is wang lei but 我的名字 是 忘 王磊 懂吗 我叫 wang 王磊 my last name is wanglei
使用while(换行符)
[root@slave3 ~]# vim test.sh #!/bin/bash while read line do echo $line done < file.txt
运行结果:
[root@slave3 ~]# sh test.sh hello world my first name is wang lei but 我的名字 是 忘 王磊 懂吗 我叫 wang 王磊 my last name is wanglei
打印出来的结果和cat文件出来的结果不太一样(tab制表符和空格混合的分隔符合并成了 “单个空格”),我暂时还没理解原因,先记住while的这个特性吧。
使用for
默认分隔符(空格、制表符)
[root@slave3 ~]# vim test.sh #!/bin/bash for word in `< file.txt` do echo $word done
运行结果:
[root@slave3 ~]# sh test.sh hello world my first name is wang lei but 我的名字 是 忘 王磊 懂吗 我叫 wang 王磊 my last name is wanglei
自定义分隔符(IFS)
#!/bin/bash IFS=$ for word in `< file.txt` do echo $word done
运行结果:
[root@slave3 ~]# sh test.sh hello world my first name is wang lei but 我的名字 是 忘 王磊 懂吗 我叫 wang 王磊 my last name is wanglei
这里的结果和cat文件的结果完全一致(空格和制表符完完整整的输出),请记住这点。
默认情况下,shell会以空格、制表符、换行符作为分隔符,可以根据实际需求使用IFS来自定义shell的分隔符。 IFS可以指定单个字符作为分隔符,IFS=:(以冒号作为分隔符);IFS也可以指定多个字符作为分隔符,IFS= :;(以反斜杠、n、冒号、分号作为分隔符)。注意:在IFS中,$’ ’和$’ ’才是换行符和制表符。