如何在 zsh 中从数组初始化数组?

How to initialize array from array in zsh?

我的脚本test.zsh:

args=$@
argss=($@)
echo ${@:2}
echo ${args:2}
echo ${argss:2}

输出:

$ ./test.zsh foo bar foobar
bar foobar
o bar foobar
o

看起来 args 被初始化为 $@ 的字符串而不是数组。如何将 args 初始化为数组? ($@) 好像也不行

您需要在 $@ 两边加上括号,使 args 成为一个数组:

args=($@)

在其他 shell 中,您还应该在其周围加上引号 (args=("$@")) 以避免分词,但在 zsh 中默认禁用此功能(请参阅选项 SH_WORD_SPLIT)。

注意 ${@:2} 会给你 ...,而 ${args:2} 会给你 ...,因为 zsh 会在 [=19=] 前面加上 $@您使用这种形式的参数下标是为了与其他 shell 兼容。 下标数组的首选 zsh 方式是 ${arr[start,end]},其中 end 是包容性的,可以是负数。 ${args[1,-1]}${args[@]} 将扩展为相同的东西。