In questo tutorial, analizziamo le dichiarazioni condizionali supportate nei casi Bash. Esaminiamo esempi pratici e discutiamo quando un caso Bash … l'istruzione esac è usata meglio di una più tradizionale. if .. then .. fi
dichiarazione.
caso bash .. Dichiarazioni Esac in bash
Disponibile nativamente dalla shell bash, frasi condizionali di casi, formulato utilizzando il case
e esac
modi di dire (un idioma è una parola o un gruppo di parole, o una parola chiave, con modelli di utilizzo stabiliti; un modo di esprimere un linguaggio informatico), si può costruire un condizionale complesso caso per caso (da qui il termine case
) perquisizione e dichiarazione di esecuzione per caso.
La parte di ricerca di un'istruzione case-based è talvolta chiamata Si prega di selezionare, che porta al termine selezionare l'istruzione / Astuccio (o vice versa), utilizado en algunos otros lenguajes de codificación como VBA, para referirse al mismo tipo de paradigma de programación. Otro conjunto de lenguajes (come C #, C ++, Java y JavaScript) llaman a esto un cambiar oh interruptor / Astuccio dichiarazione. Todos estos disponen significados y operaciones similares.
Construyamos nuestro primero case .. esac
declaración usando un script simple.
Un semplice Astuccio .. esac testo
Definimos nuestro script de prueba test.sh
come segue:
#!/bin/bash case "${1}" in 1) eco "Option was 1!";; 2) eco "Option was 2!";; *) eco "Option was something else: '${1}'";; esac
Prossimo, hacemos que nuestro script sea ejecutable ejecutando chmod +x test.sh
y posteriormente ejecutamos el propio script, ogni volta passando un'opzione diversa come input.
Nel nostro caso clausola di apertura, specifichiamo che vogliamo usare la prima opzione di input ($1
) come variabile da esaminare. I nostri case .. esac
l'istruzione controllerà ogni opzione (come indicato nel testo che precede a )
idioma clausola di chiusura) e successivamente elaborare il blocco di codice (dopo il )
idioma) per ottenere il risultato corretto.
Nota che ce ne sono due ;
terminatori di fine istruzione alla fine di ogni riga. Il motivo è semplice; la normale sintassi bash richiede che tu abbia almeno un idioma finale ;
(a meno che non sia già alla fine di una riga), ma all'interno del case .. esac
dichiarazione, abbiamo bisogno di un supplemento ;
per indicare che stiamo finendo un blocco di codice per un blocco di esecuzione del codice del caso specifico.
Possiamo vedere come abbiamo definito il codice per entrambi i casi in cui 1
e 2
se pasan al script, rispettivamente. Nonostante questo, Cosa succede quando spendiamo qualcos'altro? Quindi, vogliamo saltare al nostro Altro clausola, indicato da un universale *
idioma.
Vediamo come passiamo 1
oh 2
al copione, viene intrapresa l'azione corretta rispettivamente; Option was 1/2!
. Vediamo anche come se facciamo qualcos'altro, il *
Il blocco di codice viene eseguito correttamente, e mostra anche la nostra prima variabile passata allo script. E se non avessimo passato alcuna opzione al nostro script?? il case .. esac
il codice verrebbe comunque valutato, e poiché niente corrisponde tranne che per il nostro catch-all *
clausola, che corre:
Quindi, E se assumessimo?, qualcosa che può sembrare logico, que podemos dejar un solo ;
declaración del final de la línea de cada case .. esac
cláusula simplemente debido a que al mismo tiempo se cumple un EOL (fin de línea)?
Tenga en cuenta que solo una terminación ;
se utilizó en este script. Bash no lo posibilita y se produce un error; la sintaxis de terminación final de ;;
es obligatorio, y algo a prestar atención al escribir case .. esac
dichiarazioni
Come mai Astuccio .. esac e no e?
Además podríamos escribir el código anterior usando un if
dichiarazione:
#!/bin/bash if [ "${1}" == "1" ]; then echo "Option was 1!" elifa [ "${1}" == "2" ]; then echo "Option was 2!" else echo "Option was something else: '${1}'"; essere
Questo sembra paragonabile in termini di qualità e brevità del codice rispetto al nostro case .. esac
codice, e nelle situazioni date e casi d'uso specifici come questi, spesso a if .. then .. elif .. else .. fi
La risposta basata funzionerà bene.
Avendo detto questo, se e quando la complessità della selezione diventa più complessa o maggiore, o se ci sono selezioni di casi multistrato da eseguire (notare che case .. esac
può essere annidato), potrebbe valere la pena usarlo case .. esac
dichiarazioni invece.
Un'altra bella caratteristica di case .. esac
istruzioni è che si possono elencare due possibili opzioni per un singolo blocco di esecuzione del codice, come vedremo nel nostro prossimo esempio, nonostante questo, questo può essere fatto anche con bash standard if
dichiarazioni, usando come esempio il -a
(e e -o
(tu) opzioni della nostra clausola di test e specificando una clausola di test secondaria. Come esempio, if [ "${1}" -eq 1 -o "${1}" -eq 3 ]; then ...
Nota che qui usiamo anche confronti numerici invece di confronti basati su testo come nel nostro esempio precedente.
Per maggiori informazioni su if .. then .. else .. elif .. fi
condizionali, Puoi anche leggere i nostri post Test condizionali in Bash: Se, poi, altro, elifa.
Espandere il nostro caso
Estendiamo il nostro script sopra e rendiamo le nostre condizioni un po' più complesse:
#!/bin/bash case "${1}" in 1|3) eco "Option was 1!" eco "o, l'opzione era 3!";; 2|'un') Astuccio "${1}" in 2) eco "Option was 2!";; 'un') eco "L'opzione era "a"!";; esac;; *) eco "Option was something else: '${1}'";; esac
In questa circostanza, Abbiamo elencato due possibili opzioni per ogni blocco di codice e le abbiamo separate da a |
separatore. Nota come funziona tutto bene e gli input 1
e 3
sono analizzati correttamente. Nel secondo blocco di codice, abbiamo creato un caso annidato e usiamo ogni possibile input per il secondo blocco di codice (vale a dire 2
e a
) come nuove opzioni nell'esac nidificato / Scuola superiore.
Anche questo funziona perfettamente. Il flusso attraverso il codice è quello nel primo case
dichiarazione, il 2|'a'
il ramo è preso 2
oh a
Succede, e poi il secondo case
assicura che sia 2
oh a
è selezionato individualmente. Interessante è anche l'uso di ;;
ogni volta che vogliamo finire un blocco di codice per un'opzione specifica, e questo vale anche per la cessazione della nidificazione case .. esac
, di nuovo con ;;
, In altre parole esac;;
.
Fine
In questo tutorial, analizziamo esempi pratici di bash based case .. esac
dichiarazioni. Abbiamo anche visto dove le dichiarazioni dei casi sono un'opzione migliore rispetto a quelle più tradizionali.. if .. then .. fi
dichiarazioni supportate.
Si Bash le interesa, può trovare il primer: Bash Loop: per, mentre e su, Hack di terminazione del processo Bash e come analizzare correttamente i nomi dei file in Bash.
Godere!