2014-02-12 72 views
7

我有一個簡單的腳本(如下),它具有互斥的參數。getopts檢查互斥參數

該腳本的參數應爲./scriptname.sh -m|-d [-n],但是,用戶可以使用./scriptname.sh -m -d運行腳本,這是錯誤的。

問題:我該如何強制只有一個互斥參數由用戶提供?

#!/bin/bash 

progname=$0 

function usage() { 
    cat <<EOF 
Usage: $progname -m|-d [-n] 
where: 
    -m create minimal box 
    -d create desktop box 
    -n perform headless build 
EOF 
    exit 0 
} 

headless='false' 
buildtype='' 

while getopts 'mdnh' flag; do 
    case "${flag}" in 
    m) buildtype='minimal' ;; 
    d) buildtype='desktop' ;; 
    n) headless='true' ;; 
    h) usage ;; 
    \?) usage ;; 
    *) usage ;; 
    esac 
done 

if [ "$buildtype" == "" ]; 
then 
    usage 
    exit 
fi 
+0

別人已經問這個......等一下,我會找到它......啊,它就在那裏.. 。[如何在你的shell中使用互斥的標誌 - 堅持'getopts'?](http://stackoverflow.com/questions/21695565/how-to-use-mutually-exclusive-flags-in-your-shell-卡住與getopts)甚至在相關問題的列表。你也可以看看[在bash shell腳本中使用'getopts'來獲取長命令行和短命令行選項](http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-獲得長和短的命令行選項/)。這涵蓋了很多領域。 –

+0

我在谷歌上搜索並掃描推薦的問題,但並不認爲這些鏈接是相關的。希望我的問題標題能夠幫助那些在搜索方面不夠好的人(如我): –

回答

10

我能想到的2種方式:

接受像-t <argument>一個選項,如果參數可以是desktopminimal

所以,你的腳本將被稱爲:

./scriptname.sh -t desktop -n 

OR

./scriptname.sh -t minimal -n 

另一種方法是執行你的腳本中的驗證,因爲這:

headless='false' 
buildtype='' 

while getopts 'mdnh' flag; do 
    case "${flag}" in 
    m) [[ -n "$buildtype" ]] && usage || buildtype='minimal' ;; 
    d) [[ -n "$buildtype" ]] && usage || buildtype='desktop' ;; 
    n) headless='true' ;; 
    h) usage ;; 
    \?) usage ;; 
    *) usage ;; 
    esac 
done 
+0

非常感謝!順便說一句 - 我注意到並修復了一個錯字,'buildttype'應該是'buildtype'。 –

+0

更正了答案以及:) – anubhava

+0

如何適應代碼如果2個選項不是強制性的,但如果使用,應該只使用一個。我的代碼很相似,但默認情況下我的變量不是空的,它是'dir = pwd',選項'm'或'd'會重新定義它。 – Sigur