在zsh脚本中,将变量赋值打印到标准输出。

7
这是一个能够复现问题的示例脚本: < p >< em > example.zsh < /em >< /p >
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 只在函数内部起作用。但是当我声明变量为局部变量时,为什么它仍然会打印赋值呢?

2个回答

8
由于您在for循环中重复执行local命令。从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 命令运行脚本,所以变量已经先前被赋值。


2
在zshell中,local/typeset命令会显示已定义变量的值。您的local定义命令被执行多次,后面的命令会打印出变量的值而不是像您想要的那样将它们设为本地变量。您可以使用TYPESET_SILENT shell选项来禁用此功能。

setopt TYPESET_SILENT

"最初的回答"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接