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)
顺便说一句,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)