2014-07-11 32 views
7

是否有可能使用GNU getopt忽略未知的可選參數?linux GNU getopt:忽略未知的可選參數?

我有一個腳本scriptA.sh,它有可選參數--optA, --optB, --optC, --optD

我想寫一個包裝wrapperA,它有兩個可選參數--optX and --optY,它調用scriptA。但是,我不想在包裝器中聲明scriptA的所有可選參數。

特別是,如果裏面wrapperA,我

getopt --longoptions optX:,optY: 

調用指定可選參數

wrapperA --optX --optA --optB 

返回一個錯誤

getopt: unknown option -- optA 

可以GNU的getopt被迫忽略未知參數並將它們放在' - '後面的輸出中?

回答

5

不可能告訴GNU getopt忽略未知選項。如果你真的想要這個功能,你將不得不編寫你自己的選項解析器。

這並不像忽略未知選項那麼簡單。你怎麼知道一個未知的選項是否需要論證?原始腳本的

用法示例:

originalscript --mode foo source 

這裏foo是一個參數選項--mode。而source是「非選項參數」(有時稱爲「位置參數」)。包裝腳本的

用法示例:

wrapperscript --with template --mode foo source 

wrapperscript如何getopt說明知道它應該忽略--modefoo在一起嗎?如果它忽略--mode那麼originalscript將得到foo作爲第一位置參數。

可能的解決方法是告訴包裝腳本的用戶在雙短劃線之後編寫用於原始腳本的所有選項(--)。按照慣例,雙重短劃線標誌着選項的結束。 GNU getopt識別雙短劃線並停止解析,並將剩下的作爲位置參數返回。

參見:

+0

謝謝您的答覆。雙破折號終止選項列表將在我的情況下工作。至於忽略未知選項,我明白你的觀點 - 它並不像看起來那麼容易。我最初的想法是推出所有未知選項 - 在getopt輸出( - with template - mode foo source)中。但是,只有在後續的參數處理交給原始記錄時,這纔會起作用。正如你所說,wrapperscript無法知道originalscript的參數是否帶有參數。 – user3830744

+0

有一個類似的問題,雙破折號作爲魅力。 –

2

我工作的一個類似的事情,發現這個工作從這些錯誤纏着我停止getopt的錯誤。基本上只是將錯誤遺忘。

while getopts "i:s:" opt > /dev/null 2>&1; do 
    case $opt in 
     i) 
     END=$OPTARG 
     ;; 
    esac 
done 
./innerscript $* 

$ ./blah.sh -s 20140503 -i 3 -a -b -c

+0

**如果缺少參數採用「OPTARG」**,則會中斷。 https://gist.github.com/cirosantilli/2a803442add75e0f1e164cde183999d3 GNU Bash 4.3.48。 –

+0

如果無效選項在*有效期之前被*傳遞,這也會中斷。 – trysis