向 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 版本和 args,这是输出

############################
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中所述:

如果一个字母后跟一个冒号,则该选项应该有一个参数或一组参数,必须用空格分隔。

注意:通过上面的信息,我解决了这个问题,getopts 得到了最后一个参数,尽管它通过空格解析它,即使它被引用了。 这是因为当我应该像这样引用 main $@ 时,我像这样向主函数发送了参数 main "$@"