shell脚本中全局变量的范围

时间:2014-09-16 10:45:27

标签: bash function shell

我有这样的shell脚本,我正在读取文件并计算行号。 我从processsNumber函数

中获取了1,2,3,4 ..等日志
#!/bin/bash

number=0;
processNumber () {
    ((number++));
    echo "$number";
}

grep -E '*' readme.txt | while read -r line ; do
    processNumber "$line";
done;
echo "And at last $number";

但它记录了 "And at last 0",但我期待最后一个行号。 为什么会那样?是因为gres读取文件是一个assync调用因此echo必须是对它的回调。

或者是否无法在函数外部跟踪全局变量更改。?

如何通过更改grep和pipe来解决这个问题?

注意:我的目标找不到文件中的行数,但要理解这个

1 个答案:

答案 0 :(得分:4)

  

但它记录了#34;最后0"

这是因为您使用管道调用processNumber函数,这使得它在不在主shell中的子shell中执行,因此父shell变量保持不变为0

更新:为避免创建管道(和子shell),请使用for这样的循环:

while read -r line; do
    processNumber "$line"
done < readme.txt