GNU/Linux >> Linux Esercitazione >  >> Linux

Script della shell Parte 3:Strutture di controllo delle decisioni negli script della shell

Ciao! Abbiamo già trattato le basi dello scripting della shell come accettare input, elaborare dati tramite operazioni aritmetiche e generare e visualizzare output nelle parti precedenti di questo tutorial (parte 1 e parte 2). In questa parte, approfondiremo un argomento più avanzato in un linguaggio di programmazione:prendere decisioni in un programma, ma questa volta lo faremo usando la shell bash. Iniziamo!

Introduzione

La maggior parte dei nostri linguaggi di programmazione oggi è in grado di prendere decisioni in base alle condizioni che impostiamo. Una condizione è un'espressione che restituisce un valore booleano, vero o falso. Qualsiasi programmatore può rendere intelligente il suo programma in base alla decisione e alla logica che inserisce nel suo programma. La shell bash supporta le istruzioni decisionali if e switch (case).

Dichiarazione If

If è un'istruzione che consente al programmatore di prendere una decisione nel programma in base alle condizioni da lui specificate. Se la condizione è soddisfatta, il programma eseguirà determinate righe di codice, altrimenti il ​​programma eseguirà altre attività specificate dal programmatore. Quella che segue è la sintassi supportata dell'istruzione if nella shell bash.

Sintassi generale

Decisione unica:

if <condition>
then
    ### series of code goes here
fi

Doppia decisione:

if <condition>
then
    ### series of code if the condition is satisfied
else
    ### series of code if the condition is not satisfied
fi

Condizione multipla se:

if <condition1>
then
    ### series of code for condition1
elif <condition2>
then
    ### series of code for condition2
else
    ### series of code if the condition is not satisfied
fi

Sintassi a parentesi singola

if [ condition ]
then
    ### series of code goes here
fi

Sintassi tra parentesi quadre

if ((condition))
then
    ### series of code goes here
fi

La sintassi a parentesi singola è la più vecchia sintassi supportata nella shell bash. Viene utilizzato insieme a tutte le istruzioni condizionali in Linux. Nel frattempo, la sintassi della doppia parentesi viene utilizzata per un'istruzione condizionale basata su numeri per fornire una sintassi familiare ai programmatori. Tutti i tipi di istruzioni if ​​richiedono una condizione specificata per eseguire un'attività.

Dichiarazioni condizionali in Linux

Le istruzioni condizionali vengono utilizzate insieme a un'istruzione di controllo delle decisioni. Esistono diversi tipi di istruzioni condizionali che puoi utilizzare nella shell bash, le più comuni sono:condizioni basate su file, basate su stringhe e basate su aritmetica.

Condizione basata su file

Le condizioni basate su file sono espressioni unarie e spesso utilizzate per esaminare lo stato di un file. L'elenco seguente mostra le condizioni basate su file più comunemente utilizzate nella shell bash.

Operatore Descrizione
-un file Restituisce true se il file esiste
file -b Restituisce true se il file esiste ed è un file speciale di blocco
-c file Restituisce true se il file esiste ed è un file di caratteri speciali
-d file Restituisce true se il file esiste ed è una directory
-e file Restituisce true se il file esiste
file -r Restituisce true se il file esiste ed è leggibile
file -s Restituisce true se il file esiste e ha una dimensione maggiore di zero
file -s Restituisce true se il file esiste e ha una dimensione maggiore di zero
-w file Restituisce true se il file esiste ed è scrivibile
-x file Restituisce true se il file esiste ed è eseguibile
-N file Restituisce true se il file esiste ed è stato modificato dall'ultima lettura

Prendere una decisione basata su file

Facciamo un esempio che illustrerà come costruire una decisione basata su file in uno script bash. In questo esempio creeremo uno script che determina se il file esiste nella home directory.

#!/bin/bash

cd
ls
if [ -e sample.sh ]
then
    echo "file exists!"
else
    echo "file does not exist"
fi

In questo esempio, ci siamo assicurati che la shell tornerà alla home directory indipendentemente dalla nostra directory attiva corrente utilizzando il comando cd. Inoltre, il comando ls viene utilizzato per mostrare l'elenco dei file nella directory per consentirci di verificare l'esistenza o meno del file. Come puoi vedere, lo script emette il testo "il file esiste!" perché sample.sh si trova nella home directory.

Note: The shell compiler is very strict in terms of syntax especially with spaces. There should be a space between if and the open bracket and in between brackets and the condition.

Ora miglioriamo il nostro script rendendo il nostro codice più dinamico consentendo all'utente di inserire un nome di script e determinare i permessi del file specificato.

#!/bin/bash

cd
ls -l
read -p "Enter a file name: " filename
if [ -e $filename ]
then
    echo "file exists!"
    if [ -r $filename ]
    then
         status="readable "
    fi
    if [ -w $filename ]
    then
         status=$status"writable "
    fi
    if [ -x $filename ]
    then
         status=$status"executable"
    fi
     echo "file permission: "$status
else
    echo "file does not exist"
fi

Condizione basata su stringhe

Prendere decisioni basate su una stringa di input dell'utente è possibile anche nella shell bash. La condizione basata su stringa restituisce un'espressione binaria come risultato, restituisce true se la condizione specificata è soddisfatta, altrimenti restituisce false. I seguenti sono gli operatori condizionali basati su stringhe comunemente usati:

Operatore Descrizione
== Restituisce true se le stringhe sono uguali
!= Restituisce true se le stringhe non sono uguali
-n Restituisce true se la stringa da testare non è nulla
-z Restituisce true se la stringa da testare è nulla

Creiamo uno script di esempio utilizzando un'istruzione condizionale basata su stringhe. Lo script consentirà all'utente di inserire due stringhe e valutare se una delle stringhe è nulla, entrambe le stringhe sono uguali e non uguali.

#!/bin/bash 

read -p "First String: " str1
read -p "Second String: " str2
if [ -z "$str1" ]
then
    echo "The 1st string is null"
elif [ -z "$str2" ]
then
    echo "The 2nd string is null"
else
    if [ $str1 == $str2 ]
    then
         echo "The strings are equal"
    else
        echo "The strings are not equal"
    fi
fi

Condizione basata sull'aritmetica

La shell fornisce diversi modi per dichiarare una condizione basata sull'aritmetica. Il primo è utilizzare mnemonici che possono essere utilizzati insieme alla sintassi della parentesi singola vecchio stile e l'altro utilizza simboli compatibili con la matematica che possono essere utilizzati insieme alla doppia parentesi

Di seguito è riportato l'elenco dei mnemonici disponibili per le istruzioni condizionali basate sull'aritmetica nella shell:

Operatore Utilizzo/Descrizione
-eq Uguale
-ge Maggiore o uguale a
-gt Maggiore di
-le Inferiore o uguale a
-lt Meno di
-ne Non uguale

Creiamo uno script che accetti un numero intero dall'utente e determini se il numero intero è zero, negativo, dispari o pari.

#!/bin/bash 

read -p "Enter an integer: " int1
if [ $int1 -eq 0 ]
then
    echo "Zero"
elif [ $int1 -lt 0 ]
then
    echo "Negative"
else
    if [ $((int1%2)) -eq 0 ]
    then
        echo "Even"
    else
        echo "Odd"
    fi
fi

Operatore aritmetico per la sintassi tra parentesi doppie:

Operatore Utilizzo/Descrizione
== Uguale
>= Maggiore o uguale a
> Maggiore di
<= Inferiore o uguale a
< Meno di
!= Non uguale

Ora, ricostruiamo il nostro script precedente e usiamo la sintassi tra parentesi doppie:

#!/bin/bash

read -p "Enter an integer: " int1
if (( $int1 == 0 ))
then
    echo "Zero"
elif (( $int1 < 0 ))
then
    echo "Negative"
else
    if (( $((int1%2)) == 0 ))
    then
        echo "Even"
    else
        echo "Odd"
    fi
fi

Dichiarazione di commutazione

L'istruzione switch è un altro tipo di istruzione condizionale nello scripting della shell. Consente a un programmatore di confrontare diversi valori con una variabile in un modo più semplice rispetto all'istruzione if condizionale. La sintassi per l'istruzione switch è:


case in
<pattern1>)
    ##series of code for pattern1
    ;;
<pattern2>)
    ##series of code for pattern2
    ;;
<patternN>)
    ##series of code for patternN
    ;;
*)
    ##default statements
esac

Il pattern è il possibile valore della variabile. Ogni modello è separato da un doppio punto e virgola che funge da istruzione di interruzione del modello. L'istruzione switch viene chiusa con un'istruzione esac.

#!/bin/bash 
clear
read -p "Integer1: " int1
read -p "Integer2: " int2
echo "======================"
printf "Menu: \n[a] Addition\n[b]Subtraction\n[c]Multiplication\n[d]Division\n"
echo "======================"
read -p "Your choice: " choice
res=0
case $choice in
a)
    res=$((int1+int2))
;;
b)
    res=$((int1-int2))
;;
c)
    res=$((int1*int2))
;;
d)
    res=$((int1/int2))
;;
*)
    echo "Invalid input"
esac
echo "The result is: " $res

Conclusione

La shell bash fornisce molti strumenti utili per i programmatori. Proprio come la maggior parte dei linguaggi di programmazione oggi, è anche in grado di prendere decisioni condizionali che rendono gli script di shell più interattivi e intelligenti. Presenteremo una struttura di controllo ripetitiva nella prossima serie. Alla prossima volta.

Riferimenti

  • http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
  • https://linuxacademy.com/blog/linux/conditions-in-bash-scripting-if-statements/

La prossima lezione: strutture di controllo della ripetizione


Linux
  1. Array associativi negli script della shell?

  2. Descrittori di file e script di shell?

  3. Estensioni di file per script di shell Unix?

  4. Ordinare parte di un file?

  5. Come rimuovere qualsiasi stringa da un file tramite script di shell?

Script di shell per principianti - Come scrivere script Bash in Linux

Come verificare se esiste un file o una directory in Bash Shell

Shell Scripting Part4 – Input, Output e Reindirizzamento

Tutorial passo passo sullo scripting della shell

Array negli script di shell

Cos'è un file .sh?