考虑以下两个函数:
f1() {
if [ "$a" == "" ]; then
a="0";
else
a=$(($a+1));
fi;
echo "$a";
}
f2() {
echo "f1(): $($1)";
}
如果我f1
多次调用a
将按预期递增:
$ f1
0
$ f1
1
$ f1
2
但是,如果我f1
从f2
a
遗体中调用0
:
$ f2 "f1"
f1(): 0
$ f2 "f1"
f1(): 0
我听说(也经历过)在函数中声明的变量是全局的。那么为什么会有这样的差异呢?这是一个特例还是我没有f1
以f2
正确的方式打电话?
好的,我刚刚注意到将f2
定义更改为:
f2() {
eval "$1";
}
解决了这个问题,但是知道第一种调用的目的是什么仍然很有趣$($1)
。它究竟是做什么的?
我还注意到我无法将 的“返回”值分配f1
给f2
.
f2() {
...
res=$(eval "$1");
...
}
res
每次通话后都会一样f2 "f1"
为什么?
在 f1 中,值
a
是全局的(在 bash 中),如果a
定义为:将 f1 定义更改为:
使变量局部化。
对于 f2:在子 shell $(f2) 中调用 f2。子壳变量不影响父壳。
我要感谢任何人提到 subshell 的评论。但是我想给出更详细的答案。
每次从新的 subshell
f1
调用时,f2
都会创建一个新的子shell,并且只执行 3 条指令。a
成为全局并在子shell中初始化(至少在我的系统上,因为重复f1
调用 incrementa
)。但a
在下一个创建的子shell 中不存在。