2013-05-21 11 views
11

Sto cercando di imparare il caso perché stavo scrivendo uno script completamente funzionale.Estratto conto caso Bash

Sto partendo con il sottostante

#!/bin/sh 
case [email protected] in 

    -h|--help) 
      echo "You have selected Help" 
      ;; 
    -B|-b) 
      echo "You have selected B" 
      ;; 
    -C|-c) 
      echo "You have selected C" 
      ;; 
     *) 
      echo "Valid Choices are A,B,C" 
      exit 1 
      ;; 
esac 

Voglio usare due di queste opzioni:

./getopts.sh -h -c 

ma ottengo questo risultato scelte validi sono A, B, C

Per favore puoi aiutarmi e farmi sapere cosa sto facendo male?

Voglio creare uno script che faccia qualcosa se si inserisce un'opzione ma si fanno più cose se si inserisce più.

Inoltre, come potrei analizzare $ 1 per questo script come sicuramente quale mai l'opzione che inserisco prima (-h) sarà $ 1 ??

Grazie!

+0

Perché non usare 'getopts' invece di' case'? – fedorqui

+0

Sono aperto a qualsiasi idea in quanto non l'ho ancora usato. Ho bisogno di imparare questo piuttosto che avere 1000 di istruzioni nidificate se – bsmoo

+0

@fedorqui Anche con getopts, uno ha ancora bisogno di un ciclo (di solito un ciclo 'while') e qualche tipo di analisi del caso, e' case' è molto meglio di 'se ... elif ... 'per quello scopo. – Uwe

risposta

11

Prova questa

#!/bin/sh 

usage() { 
    echo `basename $0`: ERROR: $* 1>&2 
    echo usage: `basename $0` '[-a] [-b] [-c] 
     [file ...]' 1>&2 
    exit 1 
} 


while : 
do 
    case "$1" in 
    -a|-A) echo you picked A;; 
    -b|-B) echo you picked B;; 
    -c|-C) echo you picked C;; 
    -*) usage "bad argument $1";; 
    *) break;; 
    esac 
    shift 
done 
+0

Ok, sembra buono. Una domanda ulteriore se volessi -a fare 'whois $ 1' come farei questo lavoro voglio che l'utilizzo sia qualcosa come' ./script.sh -a example.com' o './script.sh -a - b example.com ci sono idee su questo? – bsmoo

+0

Guarda l'opzione -o in http://www.grymoire.com/Unix/Sh.html#uh-96 –

6

Utilizzare getopt o getopts è la soluzione migliore. Ma per rispondere alla tua domanda immediata, [email protected] è tutti gli dei tuoi argomenti, quindi -h -c, che non corrisponde a nessuno dei pattern a argomento singolo nell'istruzione case. Si avrebbe ancora bisogno di iterare i tuoi argomenti in questo modo

for arg in "[email protected]"; do 
    case $arg in 
     .... 
    esac 
done 
+3

FWIW: 'per arg in" $ @ "; do ... 'è equivalente a' for arg; fai ... ' –

0

per analizzare gli argomenti posizionali come ... $ 1, basta usare $ 1 nel caso stmt e poi alla fine ... Usa Maiusc per Pust il 2 ° arg a $ 1 e allo stesso modo.

anche io avrei messo il caso stmt in un ciclo while o meglio un fxn modo che io possa correre due volte per le due opzioni o il numero di opzioni ..........

$ # ti farà sapere quante opzioni/argomenti c'erano.