2017-10-11 62 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]"` ||