English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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.
Formato della sintassi if else:
if condition then command1 command2 ... commandN else comando fi
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!
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
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
Formato grammaticale del ciclo infinito:
while : do comando done
oppure
while true do comando done
oppure
for (( ; ; ))
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 È 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
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命令允许跳出所有循环(终止执行后面的所有循环)。
下面的实例中,脚本进入死循环直至用户输入数字大于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命令与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 "游戏结束"永远不会被执行。