LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1469|回复: 2

shell脚本中read 读取输入重定向文件的问题?

[复制链接]
发表于 2011-3-31 18:50:05 | 显示全部楼层 |阅读模式
在while循环中,用read读取输入输入重定向数据的问题
代码如下:
第一个循环
while IFS: read user pass uid gid fullname homedir shell
do
echo "$user"
done < /etc/passwd
第二个循环
while IFS: read user pass uid gid fullname homedir shell < /etc/passwd
do
echo "$user"
done

问题:1、为什么第二个循环只是输出文件中的第一行,而且还是死循环?
2、read 是怎么读取输入重定向文件的?是否在shell中有记忆功能,能知道读取到哪里了
发表于 2011-3-31 23:42:08 | 显示全部楼层
1. 是否应该是 IFS=":"?
2. 第1个问题跟while的机制有关系,如果while后的命令执行成功,或条件真,则执行do和done之间的语句,执行完成后,再次判断while后的命令和条件;如果while后的命令执行失败,或条件为假,循环结束。这样每次都执行成功又从while开始执行,只能重复显示第一行。
3. 第一个循环相当于 cat /etc/passwd | while read ...,整个/etc/passwd文件的每一行都进行while处理,直到文件结束,类似的写法还有很多,比如http://www.cnblogs.com/motadou/archive/2010/01/13/1646602.html。重定向跟记忆好像没有什么关系,就是从一个输出给另一个的输入,类似管道的概念,然后处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-1 18:26:18 | 显示全部楼层
Post by zhy2111314;2132952
1. 是否应该是 IFS=":"?
2. 第1个问题跟while的机制有关系,如果while后的命令执行成功,或条件真,则执行do和done之间的语句,执行完成后,再次判断while后的命令和条件;如果while后的命令执行失败,或条件为假,循环结束。这样每次都执行成功又从while开始执行,只能重复显示第一行。
3. 第一个循环相当于 cat /etc/passwd | while read ...,整个/etc/passwd文件的每一行都进行while处理,直到文件结束,类似的写法还有很多,比如http://www.cnblogs.com/motadou/archive/2010/01/13/1646602.html。重定向跟记忆好像没有什么关系,就是从一个输出给另一个的输入,类似管道的概念,然后处理。
我的意思是这样的:这两个循环,所作的第一步工作是不是都先读取/etc/passwd中的内容?不同的是第一个/etc/passwd在循环的外面,第一次执行的时候就把数据一次性全部读到内存中,然后read读取一行进行一次循环,然后内存里的指针自动指向下一行数据(read一次只能读取一行数据),读完后while条件变为假,跳出循环。第二个循环,/etc/passwd在循环里面,执行第一次循环,读取第一行数据,到第二次时循环重新来过,还是读取文件的第一行,因此这个循环一直读的就是第一行,while条件一直为真,所以造成死循环。
不知道我这样理解对不对,说的太罗嗦了,不知道你能不能看懂我想表达的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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