如何在 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[@]}
将扩展为相同的东西。
我的脚本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[@]}
将扩展为相同的东西。