ZSH命令行处理—将最后一个参数与前面的参数分开



我正在编写一个zsh脚本,使用可变数量的参数调用该脚本,例如

scriptname a b c d filename

在脚本中,我想首先循环遍历参数(最后一个参数除外)并处理它们,最后对处理过的数据和最后一个参数(filename)做一些事情。

我得到了这个工作,但我不完全满意我的解决方案。以下是我想到的(其中processapply是一些与我的问题无关的其他脚本):

#!/bin/zsh
set -u
x=""
filename=$@[-1]
# Process initial arguments
for ((i=1; i<$#; i++))
do
x+=$(process ${@[$i]}) 
done
apply $x $filename

我发现计数循环太麻烦了。如果filename是第一个参数,我将执行shift,然后可以在保存文件名后简单地循环遍历参数。然而,我想把文件名作为最后一个参数(为了与其他工具保持一致)。

不需要计数循环,有什么好主意吗?

如果有选项,可以从原始列表中截取最后一个参数并将其保存到数组中

args=("${@:1:$# -1}")
for arg in "${args[@]}"; do          # iterate over all, except the last
printf '%sn' "$arg"
done

使用数组作为占位符是可选的,因为您可以直接迭代参数slice,即for arg in "${@:1:$# -1}"; do。该语法在bash中也可用。


正如chepner的评论所指出的,您可以使用zsh特定的语法作为

for arg in $@[1,-2]; do
printf '%sn' "$arg"
done

相关内容

  • 没有找到相关文章

最新更新