GNU/Linux >> Linux Esercitazione >  >> Linux

Bash Scripting – Case Statement

Nell'articolo precedente, abbiamo visto come lavorare con le istruzioni condizionali in bash per valutare le condizioni e prendere decisioni in base ai risultati. Allo stesso modo, in questo articolo impareremo come utilizzare case statement negli script Bash, che viene utilizzato anche per valutare le condizioni. Puoi usare un'istruzione bash case invece di scrivere un lungo elenco di if..elif..else dichiarazione. Se non hai idea delle dichiarazioni condizionali, abbiamo un articolo dettagliato sull'argomento. Ti suggerisco di dargli un'occhiata prima di leggere questo articolo.

  • Scripting Bash – Dichiarazioni condizionali

Sintassi dell'istruzione Case

La sintassi dell'istruzione case in bash è riportata di seguito:

case expression in
  pattern1) STATEMENTS ;;
  pattern2) STATEMENTS ;;
  Pattern3 | Pattern4 | pattern5) STATEMENTS ;;
  pattern-N) STATEMENTS ;;
  *) STATEMENTS ;;
esac

Spiegazione:

  1. La parola chiave "case" e "esac" segna l'inizio e la fine della dichiarazione del caso.
  2. Il caso della parola chiave deve essere seguito da un "expression" . Questa espressione verrà valutata e l'output verrà ricercato rispetto all'elenco dei modelli.
  3. Dopo l'espressione, il "in" la parola chiave deve essere scritta, che punta a "value in patterns" .
  4. Puoi creare tutti i modelli che vuoi. Puoi pensare a ogni modello come a un if e elif clausola nella proposizione condizionale. Se il valore valutato dall'espressione viene confrontato con un modello, quel modello eseguirà il suo blocco di codice. I modelli rimanenti verranno saltati.
  5. Ogni istruzione all'interno del pattern deve terminare con un punto e virgola doppio (;; ).
  6. Simile alla clausola else nell'istruzione if, nell'istruzione case esiste un modello predefinito chiamato asterischi (* ) che eseguirà il suo blocco di codice se nessuno dei pattern corrisponde.

Esempio 1 - Calcolatrice che utilizza l'istruzione case

In questo esempio, ho creato una semplice calcolatrice utilizzando un'istruzione case. Lascia che ti spieghi cosa succede quando esegui questo codice.

  1. All'utente viene richiesto di inserire due numeri e questo viene memorizzato nelle variabili "X" e "Y" .
  2. All'utente viene richiesto di inserire il tipo di operazione (addizione, sottrazione, moltiplicazione, divisione) e memorizzato nella variabile "OPERATORE" .
  3. Nella dichiarazione case la variabile "OPERATOR" viene valutato e diversi modelli (+ ,- ,x ,/ ,% ) vengono creati per diverse operazioni.
  4. Se un modello è abbinato, il modello particolare eseguirà la sua istruzione saltando tutti gli altri modelli nell'istruzione case.
  5. Se provi a inserire altri valori diversi dagli operatori aritmetici desiderati, allora il modello predefinito (* ) eseguirà la sua dichiarazione.
#!/usr/bin/env bash

read -p "Enter the first number(X)  :  " X
read -p "Enter the second number(Y) :  " Y
read -p "
Addition => +
Subtract => -
Multiply => x
Division => /
Reminder => %

Choose any one operator   :  " OPERATOR
case "$OPERATOR" in
 +)
   echo -e "\nAddition of X and Y is $(( X + Y ))" ;;
 -)
   echo -e "\nSubtraction of X and Y is $(( X - Y ))" ;;
 x)
   echo -e "\nMultiply X and Y is $(( X * Y ))" ;;
 /)
   echo -e "\nDivision of X and Y is $(( X / Y ))" ;;
 %)
   echo -e "\nReminder of X and Y is $(( X % Y ))" ;;
 *)
   echo -e "\n[ERROR] You have chosen an operator that is not in the list.
You can choose either(+, -, x, /, %) operator from the list.
Rerun the program again."
esac

Dai un'occhiata all'immagine qui sotto, sto inviando il codice e scegliendo "Operatore di aggiunta" .

Sto eseguendo di nuovo lo stesso codice ma questa volta fornendo un valore casuale che creerà il modello predefinito (* ) esegue la sua istruzione.

Esempio 2 - Creazione di più pattern in una singola clausola

Nell'esempio precedente, abbiamo creato diversi modelli per diversi operatori aritmetici. È anche possibile creare più modelli nella stessa clausola e se uno qualsiasi dei modelli corrisponde, verrà eseguita l'istruzione particolare. La sintassi sarà la stessa ma aggiungerai una pipe simbolo (| ) e aggiungi motivi diversi nella stessa riga come di seguito.

case expression in
   Pattern1 | Pattern2 | pattern3) 
   STATEMENTS ;;
   *)
   STATEMENTS ;;
esac

Nell'esempio seguente, l'utente inserirà l'anno come input e otterrà i dettagli del limite arancione dai dati IPL. Negli anni 2015, 2017 e 2019 lo stesso giocatore ha vinto il cappellino arancione, quindi ho creato un anno diverso come schema nella stessa clausola.

read -p "Choose the year between 2015 - 2021 to get orange cap player name: " CAP
case "$CAP" in
 2015 | 2017 | 2019)
   echo -e "\nOrange cap winner for $YEAR is David Warner" ;;
 2016)
   echo -e "\nOrange cap winner for $YEAR is Virat Kohli" ;;
 2018)
  echo -e "\nOrange cap winner for $YEAR is Kane Williamson" ;;
 2020)
   echo -e "\nOrange cap winner for $YEAR is KL Rahul" ;;
 2021)
   echo -e "\nOrange cap winner for $YEAR is Ruturaj Gaikwad" ;;
 *)
   echo -e "\n[ERROR] Enter the year between 2015 - 2021."
esac

Esempio 3 - Corrispondenza di modelli nell'istruzione case

Corrispondenza del motivo può essere utilizzato nelle dichiarazioni dei casi. Sto usando lo stesso esempio della sezione precedente ma aggiungo un pattern extra (20[2-9][2-9]) dove se l'utente entra in qualsiasi anno superiore al 2021, stamperà un messaggio che dice "serie ancora da fare".

read -p "Choose the year between 2015 - 2021 to get orange cap player name: " CAP
case "$CAP" in
 2015 | 2017 | 2019)
   echo -e "\nOrange cap winner for $YEAR is David Warner" ;;
 2016)
   echo -e "\nOrange cap winner for $YEAR is Virat Kohli" ;;
 2018)
  echo -e "\nOrange cap winner for $YEAR is Kane Williamson" ;;
 2020)
   echo -e "\nOrange cap winner for $YEAR is KL Rahul" ;;
 2021)
   echo -e "\nOrange cap winner for $YEAR is Ruturaj Gaikwad" ;;
 20[2-9][2-9])
   echo -e "\nSeries is yet to happen for the year $CAP" ;;
 *)
   echo -e "\n[ERROR] Enter the year between 2015 - 2021."
esac

Esempio 4 - Ottieni la conferma dell'utente

A volte potresti richiedere all'utente di fornire una conferma per procedere al passaggio successivo del programma. L'uso di un'istruzione case sarebbe una buona scelta per questo caso d'uso.

Nell'esempio precedente, il modello è scritto in una riga e le istruzioni in un'altra riga, ma puoi anche scrivere modelli e istruzioni in una singola riga come mostrato di seguito.

read -p "Input file is received in CSV format, Please confirm to load the data into production database  : " CONFIRM
case "$CONFIRM" in
 [Yy] | [Yy][Ee][Ss] ) echo "++ Running the utility to load the data to the database.." ;;
 [Nn] | [Nn][Oo] ) echo -e "++ Skipping load db step upon user confirmation..\n Exiting the script.." ;;
 *) echo -e "[ERROR] = Wrong Input, Exiting the script.."
esac

Esempio 5 - Dichiarazione del caso con codici di ritorno

È possibile scrivere la logica per acquisire il codice di ritorno del comando eseguito in precedenza ed eseguire alcune azioni utilizzando le istruzioni case. Sto creando una finestra di dialogo della GUI per accettare il nome utente e la password dall'utente utilizzando zenity . Se l'utente invia correttamente il nome utente e la password, zenity genererà il codice di ritorno come zero e sulla base di esso ho aggiunto la logica per aggiungere un nuovo utente. Qualsiasi cosa diversa da zero, verrà generato un messaggio di errore.

INFO=$(zenity --password --username)
case $? in
 0)
   USERNAME=$(echo ${INFO} | awk -F "|" '{ print $1 }')
   PASSWORD=$(echo ${INFO} | awk -F "|" '{ print $2 }')
   useradd -m -p "${PASSWORD}" "${USERNAME}"
   ;;
 *)
   echo "[ERROR] - User not added."
esac

Ho premuto "Annulla" pulsante nella finestra di dialogo, quindi mi ha generato un errore utilizzando il modello predefinito (* ).

Lettura consigliata:

  • Come creare finestre di dialogo della GUI negli script Bash con Zenity in Linux e Unix

Script di riferimento

Per acquisire maggiore familiarità con le istruzioni case, puoi guardare i codici esistenti scritti utilizzando le istruzioni case. Un punto di partenza migliore sarebbe leggere gli script di avvio in /etc/init.d directory. Ad esempio, ho virtualbox installato nella mia macchina e ha un file di avvio in /etc/init.d directory. C'è una sezione di codice scritta usando un'istruzione case che darà una buona idea di come funziona l'istruzione case.

$ cd /etc/init.d/
$ cat bluetooth

Conclusione

In questo articolo, abbiamo visto cos'è l'istruzione case in Bash e diversi modi per usarla. Sia la dichiarazione condizionale che la dichiarazione del caso hanno lo stesso scopo. Dovresti avere una migliore comprensione di quale metodo si adatta al caso d'uso. Le istruzioni Case verranno utilizzate anche quando devi creare funzioni di aiuto usando getopt e getopts programmi. Crea uno script e inizia a esercitarti con gli esempi che abbiamo fornito qui per capire di più sulle affermazioni del caso.

Guide agli script di Bash:

  • Scripting Bash – Dichiarazioni condizionali
  • Scripting Bash – Manipolazione di stringhe
  • Scripting Bash – Spiegazione del comando Printf con esempi
  • Scripting Bash:array indicizzato spiegato con esempi
  • Scripting Bash:array associativo spiegato con esempi
  • Scripting di Bash:il ciclo For viene spiegato con esempi
  • Scripting Bash:spiegazione del ciclo While e Until con esempi
  • Il reindirizzamento di Bash spiegato con esempi
  • Scripting Bash:variabili spiegate con esempi
  • Scripting Bash:funzioni spiegate con esempi
  • Comando Bash Echo spiegato con esempi in Linux
  • Tutorial Bash Heredoc per principianti

Linux
  1. Script Bash(I)

  2. Utilizzo delle istruzioni Case in Bash

  3. 5 Esempi di dichiarazioni di Bash Case

  4. Bash/sh istruzione 'if else'

  5. C'è un'istruzione goto in bash?

Bash Scripting – Dichiarazioni condizionali

Bash Scripting – Manipolazione di stringhe

Come lavorare con l'istruzione Case negli script Bash

Script Bash(II)

Scripting Bash(III)

Bash If Else Sintassi con esempi