shell 使用管道符时变量的问题

2017/08/30 Linux 共 593 字,约 2 分钟

使用管道符循环

文件如下: test

1
2
3
4
5

使用管道符计算文件行数脚本如下:

#!/bin/sh  
  
linenum=0  
  
cat test | while read line  
do  
    echo "line content: $line"  
    ((linenum+=1))  
done  
  
echo "line number: $linenum"  

结果(最后echo的外部linenum无法接收到while内部改变的值):

line content: 1
line content: 2
line content: 3
line content: 4
line content: 5
line number: 0

使用重定向循环

使用重定向计算文件函数脚本如下:

#!/bin/sh  
  
linenum=0  
  
while read line  
do  
    echo "line content: $line"  
    ((linenum+=1))  
done < test  
  
echo "line number: $linenum"  

输出结果为:

line content: 1
line content: 2
line content: 3
line content: 4
line content: 5
line number: 5

总结

使用管道符时,会fork出一个子进程,变量在父子进程里无法互通。使用第二种方式,在同一个进程中,所以达到了我们预期的目的。

使用管道符循环时读取速度会比重定向快很多倍,但是如果需要进行变量传递,就必须牺牲速度用重定向的方式了,大家有所取舍吧。

支付宝打赏 微信打赏

您的打赏是对我最大的鼓励!

Search

    Post Directory