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=$'\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’才是换行符和制表符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值