gpt4 book ai didi

bash - 在 Bash 中增加一个全局变量

转载 作者:行者123 更新时间:2023-11-29 08:50:39 24 4
gpt4 key购买 nike

这是一个 shell 脚本:

globvar=0

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

myfunc
echo "something" | myfunc

echo "Global: $globvar"

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

$ 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

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

P.S. 我有一种奇怪的感觉,管道后面的函数是在 fork 的 shell 中调用的...那么,可以有一个简单的解决方法吗?

P.P.S. 这个函数是一个简单的测试包装器。它运行测试应用程序并分析其输出。然后它递增 $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"

最佳答案

顺便说一下,Korn shell 给出的结果与 zsh 相同。

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

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

globvar=0

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

myfunc "$globvar"
globalvar=$(echo "something" | myfunc "$globalvar")

关于bash - 在 Bash 中增加一个全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4257432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com