2012-02-14 15 views
10

Tutto ciò che vedo utilizza getopt o il leggermente più elegante getopts che supporta solo le opzioni a un carattere (ad esempio, -h ma non --help). Voglio fare fantasiose opzioni a lungo termine.Come posso analizzare gli argomenti di lunga durata nella shell?

+1

possibile duplicato di [Utilizzo di getopts nello script della shell bash per ottenere opzioni della riga di comando lunghe e brevi] (http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get -long-and-short-command-line-options) –

+1

@JonathanLeffler Davvero non un duplicato come 'getops' non deve essere sempre la risposta – Potherca

+1

@Potherca: E infatti,' getopts' è * non * la risposta, come ha spiegato sia in questa domanda sia nelle risposte a questa domanda. – ruakh

risposta

14

che ho fatto qualcosa di simile this:

_setArgs(){ 
    while [ "${1:-}" != "" ]; do 
    case "$1" in 
     "-c" | "--configFile") 
     shift 
     configFile=$1 
     ;; 
     "-f" | "--forceUpdate") 
     forceUpdate=true 
     ;; 
     "-r" | "--forceRetry") 
     forceRetry=true 
     ;; 
    esac 
    shift 
    done 
} 

Come si può vedere, questa supporta sia il singolo personaggio e le opzioni più piacevolmente. Consente di associare valori a ciascun argomento, come nel caso di --configFile. È anche abbastanza estensibile, senza limitazioni artificiali su quali opzioni possono essere configurate, ecc.

Come già accennato, "${1:-}" impedisce un errore "variabile non associata" durante l'esecuzione in modalità "strict" bash (set -euo pipefail).

+0

Funzionerebbe, ma non obbedirebbe ad alcune convenzioni: piegando insieme argomenti con una singola lettera e cose come '-configFile = nomefile' (il' = '). –

+1

@IanBicking - Molto vero. Tuttavia, per quanto riguarda il mio caso, ho deciso di consentire a questo di superare la frustrazione con getopt/getop ripreso dalle molte (sebbene comunque valide) risposte fornite nel duplicato contrassegnato su http://stackoverflow.com/questions/402377/using-getopts -in-bash-script di shell-to-get-lungo-e-short-riga di comando-options. – ziesemer

+0

Ah ... quella domanda non era tra i candidati per i duplicati quando ho scritto la mia domanda. Grazie! –

6

Supponendo di "voler fare fantasiose opzioni lunghe" indipendentemente dallo strumento, basta andare con getopt (getopts sembra essere utilizzato principalmente quando la portabilità è fondamentale). Ecco un example di circa la complessità massima che si otterrà:

params="$(getopt -o e:hv -l exclude:,help,verbose --name "$(basename "$0")" -- "[email protected]")" 

if [ $? -ne 0 ] 
then 
    usage 
fi 

eval set -- "$params" 
unset params 

while true 
do 
    case $1 in 
     -e|--exclude) 
      excludes+=("$2") 
      shift 2 
      ;; 
     -h|--help) 
      usage 
      ;; 
     -v|--verbose) 
      verbose='--verbose' 
      shift 
      ;; 
     --) 
      shift 
      break 
      ;; 
     *) 
      usage 
      ;; 
    esac 
done 

Con questo codice, è possibile specificare più -e/--exclude di una volta, e ${excludes[@]} conterrà tutti i dati esclude. Dopo l'elaborazione (-- è sempre presente) tutto ciò che rimane viene memorizzato in [email protected].

+0

'basename' non accetta il percorso come opzione, ma come argomento. (Non ho potuto modificare la risposta, perché il sistema richiede almeno 6 modifiche di carattere.) – jarno

+0

Grazie a @jarno, non so come si intromise. – l0b0

+1

Per un'altra cosa, penso che non sia necessario usare '$ { 2-} ', ma' $ 2' è sufficiente, dato che 'getopt' uscirà con un codice diverso da zero, se non ci fosse argomento per' -e', giusto? – jarno

Problemi correlati