栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

shell中使用for和while读取文件内容时候的区别

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/289336.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号