我有两个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并执行该函数?如果是,怎么解决这个问题?
答案 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