向 getopts 发送一个 hyphened/double-hyphened 参数

send an hyphened/double-hyphened argument to getopts

我正在使用 getopts 在 shell 脚本中获取可选参数,然后将它们用于 运行 另一个脚本。 我想发送给另一个程序的参数之一是可选参数(例如 --conf)。

但是当我将它发送到 getopts 时,我收到了这些错误消息:

service_wrapper.sh: illegal option -- -
service_wrapper.sh: illegal option -- c
service_wrapper.sh: illegal option -- o
service_wrapper.sh: illegal option -- n
service_wrapper.sh: illegal option -- f

有什么方法可以将此参数发送给 getopts?

这是解析选项的代码:

while getopts 'p:o' OPTION
    do
        case ${OPTION} in
            o) CONF=$OPTARG;;
            p) PLATFORM=$OPTARG;;
        esac
    done

这是我正在尝试的行的示例 运行:

./service_wrapper.sh config -p platform -o '--full-config-data {"json_key1":"json_val1","json_key2":"json_val2"}'

编辑:

按照评论中的建议,我打印了 bash 版本和参数,这是输出:

############################
BASH:4.2.46(2)-release
arg: config
arg: -p
arg: platform
arg: -o
arg: --full-config-data {"json_key1":"json_val1","json_key2":"json_val2"}
############################

知道了! 按照@user1934428 的建议打印参数后, 我发现最后一个参数可用于脚本但不可用于 getopts。

我试图理解为什么,它击中了我,在 'o'!

之后缺少一个冒号

而不是while getopts 'p:o' OPTION 应该是 while getopts 'p:o:' OPTION

getopts man page 中所述:

if a letter is followed by a colon, the option is expected to have an argument, or group of arguments, which must be separated from it by white space.

注意: 根据上面的信息,我解决了这个问题,getopts 得到了最后一个参数,虽然它用空格解析了它,即使它被引用了。 这是因为当我应该像这样 main "$@".

引用它时,我像这样 main $@ 向主函数发送了参数