问题描述
我使用 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 "$@"
。