2014-02-12 16 views
7

Ich habe ein einfaches Skript (unten), das sich gegenseitig ausschließende Argumente hat. Die Argumente für das Skript sollten ./scriptname.sh -m|-d [-n] sein, jedoch kann ein Benutzer das Skript mit ./scriptname.sh -m -d ausführen, was falsch ist.getopts prüft auf gegenseitig ausschließende Argumente

Frage: Wie kann ich erzwingen, dass nur eines der gegenseitig ausschließenden Argumente vom Benutzer bereitgestellt wurde?

#!/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

Jemand anderes dies wurde gefragt ... festhalten, ich werde es finden ... Ah, da ist es .. [Wie man sich gegenseitig ausschließende Flags in der Shell verwendet - festgefahren mit 'getopts'?] (Http://stackoverflow.com/questions/21695565/how-to-use-mutual-exclusive-flags-in-your-shell- Stuck-with-getopts) Es war sogar in der Liste der damit verbundenen Fragen. Sie könnten auch auf [Getopts im Bash-Shell-Skript verwenden, um lange und kurze Befehlszeilenoptionen zu erhalten] (http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-) get-long-and-short-Befehlszeilenoptionen /). Das deckt viel Territorium ab. –

+0

Ich habe auf Google gesucht und die empfohlenen Fragen gescannt, aber ich fand diese Links nicht relevant. Hoffentlich hilft mein Fragetitel anderen, die auch nicht in der Suche sind (wie ich) :) –

Antwort

10

ich 2 Möglichkeiten denken kann:

eine Option Accept wie -t <argument> Wo Argument Ihr Skript sein kann desktop oder minimal

So werden genannt wie:

./scriptname.sh -t desktop -n 

OR

./scriptname.sh -t minimal -n 

Eine weitere Alternative ist Validierung in Ihrem Skript, da dies zu erzwingen:

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

Vielen Dank! Übrigens - ich habe einen Tippfehler in der Frage bemerkt und behoben, "Buildtype" hätte "Buildtype" sein sollen. –

+0

korrigiert in der Antwort auch :) – anubhava

+0

Wie der Code anzupassen, wenn die 2 Optionen nicht obligatorisch sind, aber wenn verwendet, sollte nur einer verwendet werden. Mein Code ist ähnlich, aber meine Variable ist nicht leer als Standard, es ist 'dir = pwd' und die Optionen' m' oder 'd' würden es neu definieren. – Sigur