区别
- 使用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=$'\n'
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:;(以反斜杠、n、冒号、分号作为分隔符)。注意:在IFS中,$’\n’和$’\t’才是换行符和制表符。