无法识别的选项错误:shell 中的 getopt 命令

use*_*ser 3 bash shell getopt

我是 shell 和 Linux 的新手,如果有人能帮助我找出命令中的错误,那就太好了:

if ! options=$(getopt -n myscript -l a:,b:,cc:,dd:,ee:,ff:,gg:,hh: -- "$@"); then exit 1; fi
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

mhagent: unrecognized option '--hh'
options=' --aa '\''val1'\'' --ibb '\''val2'\'' --cc '\''val4'\'' --dd '\''val4'\'' --ee '\''val5'\'' --ff '\''val6'\'' --gg '\''val7'\'' --'
Run Code Online (Sandbox Code Playgroud)

如果我删除最后一个选项:hh,它工作正常。

if ! options=$(getopt -n myscript -l a:,b:,cc:,dd:,ee:,ff:,gg: -- "$@"); then exit 1; fi
Run Code Online (Sandbox Code Playgroud)

Com*_*uid 6

免责声明:此答案假设您使用的getopt是 util-linux。

好吧,这并不明显,但是您必须指定一个 optstring (即您想要接受的短选项列表)。假设您不想接受任何短选项,只需传递一个空字符串即可。

概要如下:

getopt optstring parameters
getopt [options] [--] optstring parameters
getopt [options] -o|--options optstring [options] [--] parameters
Run Code Online (Sandbox Code Playgroud)

请注意,所有 3 种形式都需要 optstring。

由于您需要传递-l,因此您必须使用带有选项的选项之一,因此您对 getopt 的调用应该是:

getopt -n myscript -l a:,b:,cc:,dd:,ee:,ff:,gg:,hh: -- '' "$@"
Run Code Online (Sandbox Code Playgroud)

或者:

getopt -n myscript -l a:,b:,cc:,dd:,ee:,ff:,gg:,hh: -o '' -- "$@"
Run Code Online (Sandbox Code Playgroud)