Come usare la custodia … Dichiarazioni Esac in bash

Contenuti

Bash Shell

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.

Un caso semplice ... dichiarazione esac in bash

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:

Non passare una variabile al nostro script di test funziona anche a causa della clausola * nel nostro caso .. dichiarazione esac

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)?

Terminación incorrecta del bloque de código en un caso Bash.

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

Un'alternativa a un'istruzione case..esac che utilizza un'istruzione if..then..elif..else..fi

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

Un caso più complesso ... Istruzione esac in bash con selettori aggiuntivi

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!

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.