如何在 zsh shell 中获取传递给 shell 脚本的最后一个参数?
$ example.zsh arg1 arg2 ... arglast
last argument is "arglast"
答案1
@
工作原理主要类似于包含位置参数数组的变量:$@
可以采用数组下标。最后一个元素位于位置,$#
因为$#
是参数的数量²。
printf 'Last argument is "%s"\n' "${@[$#]}"
或者,在数组下标,负值从末尾开始计数,因此[-1]
取最后一个元素。
printf 'Last argument is "%s"\n' "$@[-1]"
获取最后一个参数的另一种方法是使用P
参数扩展标志它进行两次参数查找:${(P)foo}
将 的值foo
作为另一个参数名称并扩展到该值。使用此功能#
它的工作原理类似于包含位置参数数量的变量。但请注意,这仅在至少有一个位置参数时才有效,否则您将得到$0
(当前脚本的名称)。使用@
数组就不存在这个问题。
printf 'Last argument is "%s"\n' "${(P)#}"
¹不同之处在于$@
有一个隐含的@
参数扩展中的标志,以便将"$@"
和"$@[1,3]"
扩展到多个单词,例如"$array[@]"
和"${(@)array[1,3]}"
。
² Zsh 从 1 开始计算位置参数和数组元素(除非ksh_arrays
兼容性选项打开,在这种情况下,数组元素从 0 开始计数,最后一个元素将为${@[${#}-1]}
)。