bash - 如何修改作为参数传递给wapper(如回调)的函数中的全局变量值?
问题描述
我对作为 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。
由于我现在正在做一个框架,所以可能希望一些常见的动作作为一般控制流的参数。
如何制作以函数为参数的包装器来真正修改全局变量?
谢谢~
解决方案
($1)
$1
在子外壳中运行,因为这就是括号在外壳中的作用。如果在子 shell 中运行函数,它不能更改全局变量(尽管它的执行环境是用父 shell 的变量初始化的,所以它可以看到它们)。
如果你想让回调函数在当前执行环境中运行,不要放在括号里。利用
"$1"
引号避免了$1
包含空格或全局字符的问题。
一个更常见的成语是
"$@"
它通过额外的命令行参数。
推荐阅读
- linux - 比较管道分隔文件并将不匹配的列写入输出文件
- c# - 将 .NET Core 应用程序部署到 Server 2012 的依赖性问题
- python - Windows 上的 cairosvg
- mysql - 为什么这个查询两个左连接返回相同的值?
- javascript - 如何处理空变量的默认值?
- google-cloud-platform - 来自 Google Cloud 函数的 403 响应
- ios - 在 Swift 中打印解码失败的 DecodingError 详细信息
- php - PHP imap_search 在已发送文件夹中不起作用
- git - 使用 VSCode 撤消上次推送
- javascript - 如何在javascript中计算字符串中的原始字符?