我有一个关于函数作为bash参数的问题。
如果执行以下逻辑:
Var=5
Step=2
funct() {
echo "[Line = $LINENO] $Var"
Var=$(($Var+$Step))
echo "[Line = $LINENO] $Var"
}
main()
{
echo "[Line = $LINENO] $Var"
funct
echo "[Line = $LINENO] $Var"
}
main
输出
[Line = 13] 5
[Line = 6] 5
[Line = 8] 7
[Line = 15] 7
如您所见,Var已按预期更改。
但是,请检查以下示例,其中函数作为参数传递给包装器。
Var=5
Step=2
funct() {
echo "[Line = $LINENO] $Var"
Var=$(($Var+$Step))
echo "[Line = $LINENO] $Var"
}
main()
{
echo "[Line = $LINENO] $Var"
funct
echo "[Line = $LINENO] $Var"
}
main2()
{
echo "[Line = $LINENO] $Var"
($1)
echo "[Line = $LINENO] $Var"
}
main
main2 funct
结果是
[Line = 12] 5
[Line = 5] 5
[Line = 7] 7
[Line = 14] 7
[Line = 21] 7
[Line = 5] 7
[Line = 7] 9
[Line = 23] 7
请注意,回调包装器实际上不能修改Var。
由于我现在正在做一个框架,所以可能希望一些常见的操作可以作为一般控制流的参数。
如何使用函数作为参数的包装器来真正修改全局变量?
感谢〜
答案 0 :(得分:4)
($1)
在子shell中运行$1
,因为它在shell中为what parentheses do。如果你在子shell中运行一个函数,它就不能改变全局变量(虽然它的执行环境是用父shell的变量初始化的,所以它可以看到它们。)
如果您希望回调函数在当前执行环境中运行,请不要将其放在括号中。使用
"$1"
引号可以避免$1
包含空格或整数字符的问题。
更常见的习语是
"$@"
通过其他命令行参数。
答案 1 :(得分:0)
main2()
{
echo "[Line = $LINENO] $Var"
$1
echo "[Line = $LINENO] $Var"
}
我发现删除()的工作,但不知道为什么......