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

时间:2014-11-05 15:01:57

标签: bash shell

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

a.sh

tes=2
testfunction(){
    tes=3
    echo 5
}
testfunction
echo $tes 

b.sh

tes=2
testfunction(){
    tes=3
    echo 5
}
val=$(testfunction)
echo $tes
echo $val

在第一个脚本tes中,值是'3',正如预期的那样,第二个是2?

为什么会这样?

$(funcall)是否正在创建新的子shell并执行该函数?如果是,怎么解决这个问题?

2 个答案:

答案 0 :(得分:1)

$()和``创建新shell并返回输出结果。

使用2个变量:

tes=2
testfunction(){
tes=3
tes_str="string result"
}
testfunction
echo $tes
echo $tes_str

输出

3
string result

答案 1 :(得分:0)

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

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

tes=2
testfunction(){
echo $1
}
val=$(testfunction $tes)
echo $tes
echo $val

你也可以使用return命令,虽然我会反对这个,因为它应该用于返回代码,因此只有0到255之间的范围。超出该范围的任何东西将变为0

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

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

输出

i am a string
i am a string from in the function

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