在Bash中增加一个全局变量

zse*_*rge 11 unix bash global increment

这是一个shell脚本:

globvar=0

function myfunc {
  let globvar=globvar+1
  echo "myfunc: $globvar"
}

myfunc
echo "something" | myfunc

echo "Global: $globvar"
Run Code Online (Sandbox Code Playgroud)

调用时,会打印出以下内容:

$ sh zzz.sh
myfunc: 1
myfunc: 2
Global: 1
$ bash zzz.sh
myfunc: 1
myfunc: 2
Global: 1
$ zsh zzz.sh
myfunc: 1
myfunc: 2
Global: 2
Run Code Online (Sandbox Code Playgroud)

问题是:为什么会发生这种情况,哪种行为是正确的?

PS我有一种奇怪的感觉,管道后面的功能是在一个分叉的shell中调用的......那么,有一个简单的解决方法吗?

PPS此功能是一个简单的测试包装器.它运行测试应用程序并分析其输出.然后它增加$ PASSED或$ FAILED变量.最后,您将在全局变量中获得许多通过/失败的测试.用法如下:

test-util << EOF | myfunc
input for test #1
EOF
test-util << EOF | myfunc
input for test #2
EOF
echo "Passed: $PASSED, failed: $FAILED"
Run Code Online (Sandbox Code Playgroud)

Pau*_*ce. 7

顺便说一句,Korn shell给出了与zsh相同的结果.

请参阅BashFAQ/024.管道在Bash中创建子壳,当子壳退出时变量丢失.

根据你的例子,我会重组它像这样:

globvar=0

function myfunc {
    echo $(($1 + 1))
}

myfunc "$globvar"
globalvar=$(echo "something" | myfunc "$globalvar")
Run Code Online (Sandbox Code Playgroud)