Zsh - 传递给 Shell 脚本的最后一个参数?

Akh*_*hil 3 zsh shell-script arguments

如何在 zsh shell 中获取传递给 shell 脚本的最后一个参数?

$ example.zsh  arg1 arg2 ...  arglast
last argument is "arglast"
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 5

@\xc2\xb9 的工作方式主要类似于包含位置参数数组的变量:$@可以采用数组下标。最后一个元素的位置$#$#参数\xc2\xb2 的数量。

\n
printf \'Last argument is "%s"\\n\' "${@[$#]}"\n
Run Code Online (Sandbox Code Playgroud)\n

或者,在数组下标中,负值从末尾开始计数,因此[-1]采用最后一个元素。

\n
printf \'Last argument is "%s"\\n\' "$@[-1]"\n
Run Code Online (Sandbox Code Playgroud)\n

获取最后一个参数的另一种方法是使用P参数扩展标志,该标志执行参数查找两次:${(P)foo}将 的值foo作为另一个参数名称并扩展为该值。使用它#就像包含位置参数数量的变量一样。但请注意,这仅在至少有一个位置参数时才有效,否则您将得到$0(当前脚本的名称)。使用@数组就不存在这个问题。

\n
printf \'Last argument is "%s"\\n\' "${(P)#}"\n
Run Code Online (Sandbox Code Playgroud)\n

\xc2\xb9的区别是在参数扩展中$@有一个隐含@标志,因此"$@"and"$@[1,3]"扩展为多个单词,例如"$array[@]"and "${(@)array[1,3]}"
\n\xc2\xb2 Zsh 从 1 开始计算位置参数和数组元素(除非ksh_arrays启用了兼容性选项,在这种情况下,数组元素从 0 开始计数,最后一个元素将为${@[${#}-1]})。

\n