bash脚本中的getopt解析错误(选项声明错误)

时间:2017-10-11 09:15:04

标签: bash getopt

我需要在bash脚本中获得4个选项(每个选项都包含短版和长版)。

这是我做的:

OPTS=`getopt -l :author,icon,channel,message: -o :aicm: -- "$@"` || 
exit 1
eval set -- "$OPTS"
while true; do
    case "$1" in
    -a|--author) echo "A:'$2'"; shift;;
    -i|--icon) echo "I:'$2'"; shift 2;;
    -m|--message) echo "M:'$2'"; shift 2;;
    -c|--channel) echo "C:'$2'"; shift 2;;
    --) shift; break;;
    *) echo Error; exit 1;;
    esac
done

这就是我得到的:

命令

docker run --rm -e SLACK_TOKEN slacker notify --channel foo

输出

C:'--'
Error

当然,我希望得到这样的结果:

C:'foo'

1 个答案:

答案 0 :(得分:1)

您的getopt命令看起来有点时髦。您好像使用:作为某种分隔符,在这里:

-l :author,icon,channel,message: 

在这里:

-o :aicm:

这没有任何意义。 :在选项定义中具有特殊含义;看一下getopt(1)手册页:

  

-l, --longoptions longopts

     

要识别的长(多字符)选项。超过一个   通过分隔名称,可以一次指定选项名称   用逗号。这个选项可能不止一次,longopts   是累积的。 可以遵循longopts中的每个长选项名称   用一个冒号表示它有一个必需的参数,用两个冒号   表明它有一个可选参数。

短期权也是如此。

因此,假设您的所有选项都带有参数,您可以写:

OPTS=`getopt -l author:,icon:,channel:,message: -o a:i:c:m: -- "$@"` ||