Docopt 必需标志,其值只能是几个选项之一

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

我正在使用 docopt 的 shell 实现(称为

docopts
)来编写脚本。我希望脚本有一个标志参数
--myflag
,其中值只能是几个有效选项之一:
foo
bar
baz
。所以,我尝试了这个:

eval "$(docopts -h - : "$@" <<DOCOPTS
My program: do some stuff

Usage:
  myprogram --myflag foo
  myprogram --myflag bar
  myprogram --myflag baz

Options:
  -m --myflag=MYVALUE    This should only be foo, bar, or baz. 
DOCOPTS
)"

echo the value of myflag is: $myflag

但是当我尝试使用不同的

--myflag
值运行程序时,我没有收到错误:

$ myprogram --myflag dog
the value of myflag is: dog

我本来希望看到使用消息。显然,我可以自己进行验证,但我希望 docopt 可以处理这个问题。我做错了什么?

注意:我的用例似乎与这个老问题有足够的不同(不同的编程语言,不同的参数结构),所以我不认为这是重复的。

bash arguments command-line-arguments docopt
1个回答
0
投票

Docopt 语言不强制参数的值。你得自己检查一下。

参见 http://docopt.org/

这是第一个工作示例:

parsed="$(../docopts -h - : "$@" <<DOCOPTS                                                                                            
My program: do some stuff

Usage:
  myprogram --myflag=MYVALUE

Options:
  -m --myflag=MYVALUE    Accepted MYVALUE: foo, bar, or baz.
DOCOPTS
)"

echo "$parsed"
eval "$parsed"

echo the value of myflag is: $myflag

case $myflag in
  foo|bar|baz)
    echo "ok '$myflag'"
    ;;
  *)
    echo "error: --myflag MYVALUE can only be in foo, bar, baz"
    ;;
esac

如果您希望

docopt
语言和 bash
docopts
解析器处理固定值,则应重新考虑您的命令行工具 api:

parsed="$(../docopts -h - : "$@" <<DOCOPTS
My program: do some stuff

Usage:
  myprogram foo
  myprogram bar
  myprogram baz

Arguments:
  foo   perform foo task
  bar   order a beer
        etc.
DOCOPTS
)"

#echo "$parsed"
eval "$parsed"

if $foo
then
  echo "I'm foo, welcome"
elif $bar
then
  echo "the bar is open, here's your beer 🍺"
elif $baz
then
  echo "I'm baz, what can I do for you?"
else
  echo "you should never reach this line"
  exit 1
fi

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.