2017-10-11 97 views
0

我需要在bash脚本中获得4个选项(每个选项都有一个简短版本)。在bash脚本中Getopt解析错误(选项声明错误)

这里是我做过什么:

OPTS=`getopt -l :author,icon,channel,message: -o :aicm: -- "[email protected]"` || 
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' 
+0

所以'slacker'是您正在使用其代码的命令,而且上面包括在内?你的代码看起来很模糊,就像你使用'getopts',然后用'while'循环自己重新实现它。 – tripleee

+0

为了澄清,懒鬼是我正在构建的码头图像名称。它包含一个名为notify的bash脚本,我从中提取上面的代码。我应该简化通话部分,以便更专注于我的问题。 – RaDyUm

回答

1

您的getopt命令看起来有点时髦。你似乎可以用:作为某种分隔符,在这里:

-l :author,icon,channel,message: 

在这里:

-o :aicm: 

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

-l, --longoptions longopts

长(多字符)选项得到认可。通过用逗号分隔名称 ,可以同时指定多个 选项名称。此选项可能会多次提供,长度为 是累积的。 longopts中的每个long选项名称可以跟一个冒号后面的 以指示它具有必需的参数,并由两个冒号 表示它具有可选参数。

短期选项也是如此。

所以假设你所有的选项带有参数,你可以这样写:

OPTS=`getopt -l author:,icon:,channel:,message: -o a:i:c:m: -- "[email protected]"` ||