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 可以处理这个问题。我做错了什么?
注意:我的用例似乎与这个老问题有足够的不同(不同的编程语言,不同的参数结构),所以我不认为这是重复的。
Docopt 语言不强制参数的值。你得自己检查一下。
这是第一个工作示例:
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