曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5505|回复: 3
打印 上一主题 下一主题

一次读一行(while 与 for)的区别

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2012-7-11 18:37:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
可以用 for 和 while 实现一次读取一行,但是有点区别。

供测试文本内容如下:
groad
linux  abcdef
shell
beyes kkkwedia

使用下面的脚本一次读取一行(for 读取):
[Bash shell] 纯文本查看 复制代码
#!/bin/sh
for line in `cat user.txt`
do
        echo $line
done

运行输出:
sh readfile_for.sh
groad
linux
abcdef
shell
beyes
kkkwedia
由输出可以看到,测试文本中的第 2 行(linux  abcdef)和第 4 行(beyes kkkwedia)原本是希望能够整行输出的,但是这里却被拆分成两行了。其原因是,for 在遇到行中的空格时,将按照空格来拆分。因此,如果文本中的每一行是没有空格相隔的,那么用 for 不会有问题。而对于有空格的情况,应该使用 while 来读取,下面是两种写法:

while 写法1:
[Bash shell] 纯文本查看 复制代码
#!/bin/sh


cat user.txt | while read line
do
        echo $line
done


while 写法2:
[Bash shell] 纯文本查看 复制代码
#!/bin/sh


while read line
do
        echo $line
done < user.txt

两种写法都有一样的输出:
groad
linux abcdef
shell
beyes kkkwedia

用 while 的好处时,我们可以进一步的用 awk 来单独取出每行中的 1 列,比如修改上面的代码为:
[Bash shell] 纯文本查看 复制代码
#!/bin/sh


while read line
do
        username=`echo $line | awk '{print $1}'`
        password=`echo $line | awk '{print $2}'`


        echo "--------------------"
        echo $username "++++++++" $password


done < user.txt

运行输出:
--------------------
groad ++++++++
--------------------
linux ++++++++ abcdef
--------------------
shell ++++++++
--------------------
beyes ++++++++ kkkwedia

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
沙发
 楼主| 发表于 2012-10-19 16:56:39 | 只看该作者

回 bzhao 的帖子

bzhao:你提到的区别的贡献者是read的! (2012-10-14 23:40) 
呵,你说的是对的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-29 14:06 , Processed in 0.081284 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表