English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

控制流程Shell

控制流程Shell

Diversamente da Java, PHP e altri linguaggi, il controllo di flusso di sh non può essere vuoto, come nel seguente esempio di controllo di flusso PHP:

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // Non fare nulla
}

In sh/bash non si può scrivere così, se la branca else non esegue alcuna istruzione, non si deve scrivere questo else.

if else

fi

Formato della sintassi if:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

Scritto in una riga (adatto per il prompt del terminale):

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

Il fi alla fine è l'opposto della lettera 'if', e ne incontreremo altri simili.

if else

Formato della sintassi if else:

if condition
then
    command1 
    command2
    ...
    commandN
else
    comando
fi

if else-if else

Formato della sintassi if else-if else:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

Ecco un esempio che determina se due variabili sono uguali:

a=10
b=20
if [ $a == $b ]
then
   echo 'a è uguale a b'
elif [ $a -gt $b ]
then
   echo 'a è maggiore di b'
elif [ $a -lt $b ]
then
   echo 'a è minore di b'
else
   echo 'Non ci sono condizioni soddisfatte'
fi

Risultato di output:

a è minore di b

L'istruzione if else viene spesso utilizzata con il comando test, come mostrato di seguito:

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo 'Due numeri sono uguali!'
else
    echo 'Due numeri non sono uguali!'
fi

Risultato di output:

Due numeri sono uguali!

Ciclo for

Come altri linguaggi di programmazione, lo Shell supporta il ciclo for.

La forma generale del ciclo for è:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

Scritto in una riga:

for var in item1 item2 ... itemN; do command1; command2… done;

Quando il valore della variabile è nella lista, il ciclo for esegue tutte le comandi una volta, utilizzando il nome della variabile per ottenere il valore corrente nella lista. I comandi possono essere qualsiasi comando o istruzione valida dello shell. La lista 'in' può contenere sostituzioni, stringhe e nomi di file.

La lista 'in' è opzionale, se non viene utilizzata, il ciclo for utilizza i parametri di posizione della riga di comando.

Ad esempio, eseguire l'output in sequenza dei numeri della lista corrente:

for loop in 1 2 3 4 5
do
    echo "Il valore è: $loop"
done

Risultato di output:

Il valore è: 1
Il valore è: 2
Il valore è: 3
Il valore è: 4
Il valore è: 5

Output sequenziale dei caratteri della stringa:

#!/bin/bash
for str in Questo è una stringa
do
    echo $str
done

Risultato di output:

Questo
è
a
stringa

istruzione while

Il ciclo while viene utilizzato per eseguire una serie di comandi ripetutamente, e anche per leggere dati da un file di input. Il formato grammaticale è:

while condition
do
    comando
done

Ecco un ciclo while di base, la condizione di test è: se int è meno o uguale a 5, la condizione restituisce vero. int parte da 1, ogni volta che il ciclo viene elaborato, int viene incrementato di 1. Esegui lo script sopra, restituisce i numeri da 1 a 5 e poi termina.

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

Esegui lo script, il output è:

1
2
3
4
5

Gli esempi precedenti utilizzano il comando Bash let, che viene utilizzato per eseguire una o più espressioni, non è necessario aggiungere $ per rappresentare le variabili, si può consultare:Comando Bash let

.

Il ciclo while può essere utilizzato per leggere informazioni dalla tastiera. Nell'esempio seguente, le informazioni di input sono impostate come variabile FILM, termina con <Ctrl-D>.

echo 'Premi <CTRL-D> per uscire'
echo -n 'Inserisci il nome del tuo sito web preferito: '
while read FILM
do
    echo "Sì! $FILM è un buon sito"
done

Esegui lo script, il output è simile al seguente:

Premi <CTRL-D> per uscire
Inserisci il nome del tuo sito web preferito: il sito web di base
Sì! Il sito web di base è un buon sito

Ciclo infinito

Formato grammaticale del ciclo infinito:

while :
do
    comando
done

oppure

while true
do
    comando
done

oppure

for (( ; ; ))

Ciclo until

Il ciclo until esegue una serie di comandi fino a quando la condizione non diventa true.

Il ciclo until e il ciclo while si oppongono l'uno all'altro nel modo di gestione.

Di solito il ciclo while è superiore al ciclo until, ma in alcuni casi - solo in casi estremamente rari - il ciclo until è più utile.

Formato grammaticale di until:

fino a condition
do
    comando
done

La condizione di solito è un'espressione condizionale, se il valore di ritorno è false, continua a eseguire le istruzioni nel corpo del ciclo, altrimenti esce dal ciclo.

Nei seguenti esempi utilizziamo il comando until per outputtare i numeri da 0 a 9:

#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

Risultato dell'esecuzione:

Il risultato dell'output è:

0
1
2
3
4
5
6
7
8
9

case ... esac

case ... esac È una scelta multipla, simile alla frase switch ... case in altri linguaggi, è una struttura di scelta a ramificazione multipla, ogni ramo di scelta inizia con un parentesi destro, e viene utilizzato due punti e due punti (;;) per rappresentare break, che significa che l'esecuzione è finita, e si esce da tutta la frase case ... esac, esac (che è il caso inverso) come segno di fine.

Può essere utilizzato per abbinare un valore a un modello con la frase case, se il match è successo, esegue il comando corrispondente al modello.

case ... esac Il formato della sintassi è come segue:

case valore in
Modello 1)
    command1
    command2
    ...
    commandN
    ;;
Modello 2)
    command1
    command2
    ...
    commandN
    ;;
esac

Il modo di funzionamento del case è come sopra descritto, il valore deve essere seguito dalla parola inOgni modello deve finire con un parentesi destra. Il valore può essere una variabile o una costante, una volta che il valore corrisponde a un modello, tutte le istruzioni tra di loro iniziano a essere eseguite fino a;;.

Il valore di ricerca verifica ogni modello di corrispondenza. Una volta che il modello è corrispondente, esegue il comando corrispondente al modello e non continua altri modelli. Se nessun modello corrisponde, utilizza l'asterisco * per catturare il valore, quindi esegue il comando successivo.

Il seguente script indica di inserire 1 a 4, corrispondendo a ogni modello:

echo 'Inserisci un numero tra 1 e 4:'
echo 'Il numero che hai inserito è:'
read aNum
case $aNum in
    1) echo 'Hai scelto 1'
    ;;
    2) echo 'Hai scelto 2'
    ;;
    3) echo 'Hai scelto 3'
    ;;
    4) echo 'Hai scelto 4'
    ;;
    *) echo 'Non hai inserito un numero tra 1 e 4'
    ;;
esac

Inserendo contenuti diversi, si ottengono risultati diversi, ad esempio:

Inserisci un numero tra 1 e 4:
Il numero che hai inserito è:
3
Hai scelto 3

Il seguente script corrisponde a una stringa:

#!/bin/sh
site="w3codebox"
case "$site" in
   "w3codebox") echo "Base Tutorial Website" 
   ;;
   "google") echo "Google Ricerca" 
   ;;
   "taobao") echo "淘宝网" 
   ;;
esac

Il risultato dell'output è:

Base Tutorial Website

Esci dal ciclo

Nel processo di loop, a volte è necessario uscire forzatamente dal ciclo prima di raggiungere la condizione di fine del ciclo, lo Shell utilizza due comandi per implementare questa funzione: break e continue.

break命令

break命令允许跳出所有循环(终止执行后面的所有循环)。

下面的实例中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        * echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done

执行以上代码,输出结果为:

输入 1 到 5 之间的数字:3
你输入的数字为 3!
输入 1 到 5 之间的数字:7
你输入的数字不是 1 到 5 之间的! 游戏结束

continue

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

对上面的实例进行修改:

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        * echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done

运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句echo "游戏结束"永远不会被执行。