2012-07-01 61 views
27

是否可以使用getopts一起處理多個選項?例如,myscript -iR或myscript -irv。帶有多個選項和強制選項的bash getopts

另外,我有一種情況,基於條件腳本將需要強制性選項。例如,如果腳本的參數是目錄,則需要指定-R或-r選項以及任何其他選項(myscript -iR mydir或myscript -ir mydir或myscript -i -r mydir或myscript -i -R mydir),如果只有文件-i就足夠了(myscript -i myfile)。

我試圖搜索,但沒有得到任何答案。

回答

73

您可以連接您提供的選項,getopts將它們分開。在您的case聲明中,您將分別處理每個選項。

您可以在看到選項時設置一個標誌,並檢查以確保在getopts循環完成後確保有強制性「選項」(!)。

下面是一個例子:

#!/bin/bash 
rflag=false 
small_r=false 
big_r=false 

usage() { echo "How to use"; } 

options=':ij:rRvh' 
while getopts $options option 
do 
    case $option in 
     i ) i_func;; 
     j ) j_arg=$OPTARG;; 
     r ) rflag=true; small_r=true;; 
     R ) rflag=true; big_r=true;; 
     v ) v_func; other_func;; 
     h ) usage; exit;; 
     \?) echo "Unknown option: -$OPTARG" >&2; exit 1;; 
     : ) echo "Missing option argument for -$OPTARG" >&2; exit 1;; 
     * ) echo "Unimplemented option: -$OPTARG" >&2; exit 1;; 
    esac 
done 

shift $(($OPTIND - 1)) 

if ! $rflag && [[ -d $1 ]] 
then 
    echo "-r or -R must be included when a directory is specified" >&2 
    exit 1 
fi 

這代表getopts功能的完整參考實施,但僅是一個較大的腳本的一個草圖。

+1

非常感謝丹尼斯。按照你的建議,我使用了這些標誌。我嘗試通過連接選項並將它們存儲在變量中並稍後根據所提供的選項進行處理來簡化邏輯。 –

+0

@RameshSamane:不客氣。如果您發現我的答案有幫助,請將其標記爲已接受。 –

+0

我已經試過,但得到消息「投票需要15聲望」。不過,我在線索底部點擊了「是」,問題是「這篇文章對你有用嗎?」並獲得了「感謝您的反饋」的信息。 –

相關問題