2012-07-01 18 views
27

È possibile utilizzare getopts per elaborare più opzioni insieme? Ad esempio, myscript -iR o myscript -irv.geth bash con opzioni multiple e obbligatorie

Inoltre, ho una situazione in cui in base a uno script di condizione sarebbe necessaria l'opzione obbligatoria. Ad esempio, se l'argomento script è una directory, dovrò specificare l'opzione -R o -r insieme a qualsiasi altra opzione (myscript -iR mydir o myscript -ir mydir o myscript -i -r mydir o myscript -i -R mydir), in caso di file solo -i è sufficiente (myscript -i miofile).

Ho provato a cercare ma non ho ricevuto alcuna risposta.

risposta

73

È possibile concatenare le opzioni fornite e getopts le separerà. Nella tua istruzione case gestirai ciascuna opzione singolarmente.

È possibile impostare un flag quando sono visualizzate le opzioni e verificare che siano presenti "opzioni" obbligatorie (!) Dopo che il ciclo getopts è stato completato.

Ecco un esempio:

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

Ciò rappresenta un'implementazione di riferimento complessivo di una funzione getopts, ma è solo un riassunto di uno script grande.

+1

Mille grazie Dennis. Ho usato le bandiere come hai suggerito. Ho cercato di semplificare la logica concatenando le opzioni e memorizzandole in una variabile e successivamente eseguendo l'elaborazione in base alle opzioni fornite. –

+0

@RameshSamane: prego. Se hai trovato la mia risposta utile, contrassegnala come accettata. –

+0

L'ho già provato, ma ho ricevuto il messaggio "La votazione richiede 15 reputazione". Tuttavia ho cliccato su "Sì" nella parte inferiore del thread per la domanda "Questo post ti è stato utile?" e ha ricevuto il messaggio "Grazie per il tuo feedback". –