变量的赋值在zsh脚本中打印在stdout上

时间:2018-01-17 15:04:50

标签: shell zsh

这是一个重现问题的示例脚本:

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时,为什么还要打印赋值?

2 个答案:

答案 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