如何使用zparseopts同时拥有多头和空头选项

问题描述 投票:0回答:1

我正在尝试使用

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

我似乎误解了如何使用它,因为我没有得到我所期望的。

zsh
1个回答
0
投票

这有点接近,但看起来

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 列表的循环并没有那么复杂。

© www.soinside.com 2019 - 2024. All rights reserved.