我正在编写一个zsh脚本,使用可变数量的参数调用该脚本,例如
scriptname a b c d filename
在脚本中,我想首先循环遍历参数(最后一个参数除外)并处理它们,最后对处理过的数据和最后一个参数(filename)做一些事情。
我得到了这个工作,但我不完全满意我的解决方案。以下是我想到的(其中process
和apply
是一些与我的问题无关的其他脚本):
#!/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