测试用到的text文件
1111111111111111111111111111111111111111111 2222222222222222222222222222222222222222222222 333333333333333333333333333333333333333333333 666666666666666666666666666666666666666666666 77777777777777777777777777777777777777777777 888888888888888888888888888888888888888888888
方法一(大坑):
cat text | while read line do echo $line; done -------------------------------------- echo "str" | while read line do echo $line; done
注意!注意!注意!
str="abcdefg" cat ./text | while read line do echo $line str=$line done echo "---------------------------" echo "Str: ${str}"
理论上的输出结果应该是输出文本的每一行之后,最后str的值应该是: 888888888888888888888888888888888888888888888
实际结果:
1111111111111111111111111111111111111111111 2222222222222222222222222222222222222222222222 333333333333333333333333333333333333333333333 666666666666666666666666666666666666666666666 77777777777777777777777777777777777777777777 888888888888888888888888888888888888888888888 --------------------------- Str: abcdefg
while read 内对str的赋值完全是无效的,原因是:
while read line命令从管道中输出中读取数据。注意,while是管道的最后一个命令,将在子Shell中运行。
管道的最后一个命令都是在子Shell中执行的。这意味着在子Shell中赋值的变量对父Shell是无效的。所以当我们将管道输出传送到一个循环结构,填入随后将要使用的变量,那么就会产生很多问题。一旦循环完成,其所依赖的变量就不存在了。
搜索还发现: cat text会一次性将text文件所有数据装入内存,如果text文件足够大,会直接占用巨量内存
方法二:(推荐)
str="abcdefg" while read line do echo $line str=$line done < ./text echo "---------------------------" echo "Str: ${str}"
输出结果:
1111111111111111111111111111111111111111111 2222222222222222222222222222222222222222222222 333333333333333333333333333333333333333333333 666666666666666666666666666666666666666666666 77777777777777777777777777777777777777777777 888888888888888888888888888888888888888888888 --------------------------- Str: 888888888888888888888888888888888888888888888
此种就不存在方法一的赋值失败的问题了!
方法三: 有问题
#!/bin/bash str="abcdefg" while read line < ./text do echo $line str=$line sleep 1s done echo "---------------------------" echo "Str: ${str}"
此种方法while是个死循环不会结束,而且每次读取到的都是第一行.至于为什么我还不知道.
还没有评论,来说两句吧...