2017-10-11 15 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) manページを見てみましょう:

-l, --longoptions longopts

長い(複数文字の)オプションが認識されます。 1つ以上の オプション名は、 をコンマで区切って一度に指定できます。このオプションは複数回指定することができ、longopts は累積します。 longoptsの各長いオプション名の後には、1つのコロンで必要な引数があることを示す 、2つのコロンである のあとにオプションの引数があることを示します。

短いオプションの場合も同じです。

は、だからあなたのすべてのオプションが引数を取ると仮定し、次のように記述します。

OPTS=`getopt -l author:,icon:,channel:,message: -o a:i:c:m: -- "[email protected]"` || 
関連する問題