这是重现该问题的示例脚本:
example.zsh
zmodules=(foo bar/baz)
local zmodule
for zmodule (${zmodules}); do
local zurl zname
zname=${zmodule##*/}
case ${#zmodule//[^\/]/} in
0) zurl="https://github.com/foo/${zmodule}" ;;
1) zurl="https://github.com/${zmodule}" ;;
esac
print "${zurl} ${zname}"
done
当前脚本运行结果:
$ source ./example.zsh 2>/dev/null
zmodule=bar/baz
zurl=https://github.com/bar/baz
zname=baz
https://github.com/foo/foo foo
zurl=https://github.com/foo/foo
zname=foo
https://github.com/bar/baz baz
预期结果:
$ source ./example.zsh 2>/dev/null
https://github.com/foo/foo foo
https://github.com/bar/baz baz
我在这里缺少什么?
编辑:我想我明白了:local
仅适用于函数内部。但是当我将变量声明为本地时,为什么它仍然打印赋值呢?
最佳答案
这是因为您在 for
循环中重复执行 local
。来自 man zshbuiltins
:
local
Same as
typeset
, except ...
typeset
Set or display attributes and values for shell parameters.
因此,执行 local var
(不任何赋值)将导致 zsh
显示该变量的属性和值如果已经存在。请参阅演示该行为的这段代码:
$ local var
$ var=10
$ local var
var=10
$ local var=15
$ local var2=20 var
var=15
<小时/>
旁注:您可能会问为什么两个作业都被打印,而在我的示例中,第一个 local
不打印任何内容。这是因为您使用source
来运行脚本,因此变量已经根据您之前的尝试设置。
关于shell - 变量的赋值会打印在 zsh 脚本的 stdout 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48304122/