这是一个重现问题的示例脚本:
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时,为什么还要打印赋值?
答案 0 :(得分:4)
这是因为您在local
循环中重复执行for
。来自man zshbuiltins
:
local
与
typeset
相同,但......
typeset
设置或显示shell参数的属性和值。
因此,执行local var
(不任何分配)将导致zsh
显示该变量的属性和值(如果已存在)。请参阅此片段,演示该行为:
$ local var
$ var=10
$ local var
var=10
$ local var=15
$ local var2=20 var
var=15
旁注 :您可能会问为什么两个作业都在打印,而在我的示例中,第一个local
没有打印任何内容。这是因为您使用source
来运行脚本,因此变量已经设置。
答案 1 :(得分:0)
在zshell中,local
/ typeset
命令显示任何已定义的变量的值。您的local
定义命令会执行多次,而后面的命令会打印变量的值,而不是根据需要将其设置为局部变量。您可以使用TYPESET_SILENT
shell选项禁用此功能。
setopt TYPESET_SILENT