全局变量值未在 shell 脚本中的函数内部设置

nan*_*itv 5 bash shell

我有两个 shell 脚本,如下所示:

tes=2
testfunction(){
    tes=3
    echo 5
}
testfunction
echo $tes 
Run Code Online (Sandbox Code Playgroud)

b.sh

tes=2
testfunction(){
    tes=3
    echo 5
}
val=$(testfunction)
echo $tes
echo $val
Run Code Online (Sandbox Code Playgroud)

在第一个脚本中,tes值是“3”,如预期,但在第二个脚本中,它是 2?

为什么它会这样?

$(funcall)创建一个新的子shell并执行该函数吗?如果是,如何解决这个问题?

小智 0

您当前的解决方案创建一个子 shell,该子 shell 将拥有自己的变量,该变量在终止时将被销毁。

解决这个问题的一种方法是将 tes 作为参数传递,然后使用 echo 返回*它。

tes=2
testfunction(){
echo $1
}
val=$(testfunction $tes)
echo $tes
echo $val
Run Code Online (Sandbox Code Playgroud)

您也可以使用该return命令,尽管我建议不要这样做,因为它应该用于返回代码,因此范围仅限于 0-255。该范围之外的任何内容都将变为 0

要返回字符串,请执行相同的操作

tes="i am a string"
testfunction(){
echo "$1 from in the function"
}
val=$(testfunction "$tes")
echo $tes
echo $val
Run Code Online (Sandbox Code Playgroud)

输出

i am a string
i am a string from in the function
Run Code Online (Sandbox Code Playgroud)

*并不真正返回它,它只是将其发送到子 shell 中的 STDOUT,然后将其分配给 val