shell - 变量的赋值会打印在 zsh 脚本的 stdout 上

标签 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仅适用于函数内部。但是当我将变量声明为本地时,为什么它仍然打印赋值呢?

最佳答案

这是因为您在 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/

相关文章:

shell - 使用 wamp 在本地命令行

python - 从 python 运行 shell 命令的最佳方法

bash - 在 bash 中将十六进制转换为十进制

bash - 获取脚本目录的 bash 脚本的 zsh 等价物是什么?

node.js - NVM 无法加载具有默认别名集的默认 Node

bash - 以 ">"开头的 Shell 命令

linux - bash陷阱和过程替换

bash - 如何为 curl 命令对数据进行 urlencode?

macos - if 中的 zsh 变量赋值

macos - brew :/usr/bin occurs before/usr/local/bin