【问题标题】:Scope of global variable in shell script [duplicate]shell脚本中全局变量的范围[重复]
【发布时间】:2014-09-16 10:45:27
【问题描述】:

我有一个这样的 shell 脚本,我正在读取一个文件并计算行号。 我从 processesNumber 函数内部得到了 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 通过异步调用读取文件,因此 echo 必须是对其的回调。

或者是函数外无法跟踪全局变量的变化?

如何在不更改 grep 和管道的情况下解决此问题?

注意:我的目标不是找到文件中的行数,而是要理解这一点

【问题讨论】:

    标签: bash function shell


    【解决方案1】:

    但它会记录“最后是 0”

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

    更新:为避免创建管道(和子shell),请使用for 循环,如下所示:

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

    【讨论】:

    • 有没有办法像 javascriot 回调一样在 shell 中进行回调?
    • Shell 没有像 JS 在 String#replace 中那样的回调,但如果你明确你想要做什么,我们肯定会提供帮助。但我也要求不要在做事时完全改变问题。
    • 我需要一种方法来解决这个问题,而无需更改管道逻辑
    • 好的,请检查我的更新答案。
    • 这对你有用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2015-08-07
    • 2014-09-17
    • 2019-07-04
    • 2010-11-30
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多