我正在尝试使用
zparseopts
来获取长参数和短参数,其中一个参数是可加的,其他参数是单组的。
示例
foo.sh --pod longpod --pod longpod2 -p shortpod --from fromdate -t todate
其中会有:
pods=(longpod longpod2 shortpod)
from='fromdate'
to='todate'
但是,这不是我得到的。这是一个示例脚本:
function main() {
zparseopts -E -D -- \
-pod+:=pods \
-from::=from \
-to::=to
echo "pods: ${pods[@]}"
echo "from: ${from}"
echo "to ${to}"
}
main "${@}"
产生:
pods: --pod longpod --pod longpod2
from: --fromlongfrom
to --tolongto
我似乎误解了如何使用它,因为我没有得到我所期望的。
这有点接近,但看起来
zparseopts
总是会在结果数组中包含选项名称(例如 --pod longpod
)。使用可选参数 (::
),它将始终将名称和值放在同一元素中 (--fromlongfrom
):
#!/usr/bin/env zsh
function main() {
zparseopts -E -D -- \
-pod+:=pods \
p+:=pods \
-from::=from \
t::=to
typeset -p pods from to argv
}
main --pod longpod --pod longpod2 -p shortpod \
--from fromdate -t todate --to longto
#=> typeset -g -a pods=( --pod longpod --pod longpod2 -p shortpod )
#=> typeset -g -a from=( --fromfromdate )
#=> typeset -g -a to=( -ttodate )
#=> typeset -g -a argv=( --to longto )
后处理可用于删除选项名称:
pods=(${pods:#(--pod|-p)})
from=${from#--from}
to=${to#-t}
typeset -p pods from to
#=> typeset -g -a pods=( longpod longpod2 shortpod )
#=> typeset -g from=fromdate
#=> typeset -g to=todate
TBH,我已经放弃尝试使用
zparseopts
;除此之外,它不支持 --opt=val
样式参数,并且有一些用例它不能很好地处理。遍历 arg 列表的循环并没有那么复杂。