Contrôle de flux Shell

Contrairement à des langages tels que Java et PHP, le contrôle de flux en sh ne peut pas être vide. Par exemple (ce qui suit est la syntaxe de contrôle de flux PHP) :

Exemple

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // Ne rien faire
}

En sh/bash, vous ne pouvez pas l'écrire comme ceci. Si la branche else n'a aucune instruction à exécuter, n'écrivez pas ce else.


if else

if

syntaxe de l'instruction if :

if condition
then
    command1 
    command2
    ...
    commandN 
fi

Écrit sur une ligne (applicable à l'invite de commande du terminal) :

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

Lefifinal estifépelé à l'envers ; vous en rencontrerez des similaires plus tard.

if else

syntaxe de if else :

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

if else-if else

syntaxe de if else-if else :

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

Dans if else,[...]dans les instructions de comparaison, supérieur à utilise-gt, et inférieur à utilise-lt。

if [ "$a" -gt "$b" ]; then
    ...
fi

Si vous utilisez((...))comme instruction de comparaison, supérieur à et inférieur à peuvent être utilisés directement>et<。

if (( a > b )); then
    ...
fi

L'exemple suivant vérifie si deux variables sont égales :

Exemple

a=10
b=20
if [ $a == $b ]
puis
   echo "a equals b"
elif [ $a -gt $b ]
puis
   echo "a est supérieur à b"
elif [ $a -lt $b ]
puis
   echo "a est inférieur à b"
else
   echo "Aucune condition correspondante"
fi

Sortie :

a 小于 b

En utilisant((...))comme instruction de comparaison :

Exemple

a=10
b=20
if (( $a == $b ))
puis
   echo "a equals b"
elif (( $a > $b ))
puis
   echo "a est supérieur à b"
elif (( $a < $b ))
puis
   echo "a est inférieur à b"
else
   echo "Aucune condition correspondante"
fi

Sortie :

a 小于 b

L'instruction if else est souvent utilisée avec la commande test, comme indiqué ci-dessous :

Exemple

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
puis
    echo 'Les deux nombres sont égaux !'
else
    echo 'Les deux nombres ne sont pas égaux !'
fi

Sortie :

The two numbers are equal!

boucle for

Comme dans d'autres langages de programmation, Shell prend en charge les boucles for.

Le format général d'une boucle for est :

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

Écrit sur une seule ligne :

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

Lorsque la valeur de la variable se trouve dans la liste, la boucle for exécute toutes les commandes une fois, en utilisant le nom de la variable pour obtenir la valeur actuelle dans la liste. Les commandes peuvent être n'importe quelles commandes et instructions shell valides. La liste in peut contenir des substitutions, des chaînes de caractères et des noms de fichiers.

La liste in est facultative. Si vous ne l'utilisez pas, la boucle for utilise les paramètres positionnels de la ligne de commande.

Par exemple, affichez les nombres de la liste actuelle dans l'ordre :

Exemple

for loop in 1 2 3 4 5
do
    echo "La valeur est : $loop"
done

Sortie :

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

Affichez les caractères d'une chaîne dans l'ordre :

#!/bin/bash

for str in This is a string
do
    echo $str
done

Sortie :

This
is
a
string

Instruction while

La boucle while est utilisée pour exécuter en continu une série de commandes et aussi pour lire des données à partir d'un fichier d'entrée. Son format de syntaxe est :

while condition
do
    command
done

Ce qui suit est une boucle while de base. La condition de test est : si int est inférieur ou égal à 5, la condition renvoie true. int commence à 1, et à chaque fois que la boucle s'exécute, int augmente de 1. L'exécution du script ci-dessus renvoie les nombres de 1 à 5, puis se termine.

Exemple

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

Exécutez le script, sortie :

1
2
3
4
5

L'exemple ci-dessus utilise la commande Bash let, qui sert à exécuter une ou plusieurs expressions. Dans les calculs de variables, vous n'avez pas besoin d'ajouter $ pour représenter les variables. Pour plus de détails, voir :commande let de Bash

。

La boucle while peut être utilisée pour lire les entrées du clavier. Dans l'exemple suivant, l'entrée est affectée à la variable FILM, et appuyez sur <Ctrl-D> pour terminer la boucle.

Exemple

echo 'Appuyez sur <CTRL-D> pour quitter'
echo -n 'Entrez le nom de votre site web préféré : '
while read FILM
do
    echo "Oui !$FILMest un bon site web"
done

Exécutez le script, la sortie est similaire à ce qui suit :

按下 <CTRL-D> 退出
输入你最喜欢的网站名:Example
是的!Example 是一个好网站

Boucle infinie

Format de syntaxe de boucle infinie :

while :
do
    command
done

Or

while true
do
    command
done

Or

for (( ; ; ))


boucle until

La boucle until exécute une série de commandes jusqu'à ce que la condition devienne vraie, puis s'arrête.

La boucle until est exactement l'opposé de la boucle while dans sa méthode de traitement.

Généralement, les boucles while sont meilleures que les boucles until, mais à certains moments—seulement dans de très rares cas—les boucles until sont plus utiles.

Format de syntaxe de until :

until condition
do
    command
done

condition est généralement une expression conditionnelle. Si la valeur de retour est false, les instructions à l'intérieur du corps de la boucle continuent de s'exécuter ; sinon, elle sort de la boucle.

Dans l'exemple suivant, nous utilisons la commande until pour afficher les nombres 0 ~ 9 :

Exemple

#!/bin/bash

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

Résultat de l'exécution :

Le résultat de sortie est:

0
1
2
3
4
5
6
7
8
9

case ... esac

case ... esacest une instruction à choix multiples, similaire à l'instruction switch ... case dans d'autres langages. Il s'agit d'une structure de sélection à branches multiples. Chaque branche case commence par une parenthèse fermante et se termine par deux points-virgules;;signifie break, c'est-à-dire que l'exécution se termine, et elle sort de toute l'instruction case ... esac. esac (qui est case épelé à l'envers) sert de marqueur de fin.

Vous pouvez utiliser l'instruction case pour faire correspondre une valeur à un motif. Si la correspondance réussit, la commande correspondante est exécutée.

case ... esacLe format de syntaxe est le suivant :

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

Le fonctionnement de case est comme indiqué ci-dessus. La valeur doit être suivie du motin, chaque motif doit se terminer par une parenthèse fermante. La valeur peut être une variable ou une constante. Après que la correspondance a trouvé que la valeur correspond à un motif, toutes les commandes comprises entre les deux commencent à s’exécuter jusqu’à;;。

La valeur sera comparée à chaque motif pour trouver une correspondance. Une fois qu’un motif correspond, après l’exécution des commandes correspondantes du motif trouvé, il ne continuera pas avec les autres motifs. Si aucun motif ne correspond, utilisez l’astérisque * pour capturer la valeur, puis exécutez les commandes suivantes.

Le script suivant demande une saisie de 1 à 4 et la compare à chaque motif :

Exemple

echo 'Entrez un nombre entre 1 et 4 :'
echo 'Le nombre que vous avez saisi est :'
read aNum
case $aNum in
    1)  echo 'Vous avez choisi 1'
    ;;
    2)  echo 'Vous avez choisi 2'
    ;;
    3)  echo 'Vous avez choisi 3'
    ;;
    4)  echo 'Vous avez choisi 4'
    ;;
    *)  echo 'Vous n’avez pas saisi de nombre entre 1 et 4'
    ;;
esac

Saisir un contenu différent produira des résultats différents, par exemple :

输入 1 到 4 之间的数字:
你输入的数字为:
3
你选择了 3

Le script suivant met en correspondance des chaînes :

Exemple

#!/bin/sh

site="example"

case "$site" in
   "example") echo "Tutoriel d'exemple"
   ;;
   "google") echo "Recherche Google"
   ;;
   "taobao") echo "Taobao"
   ;;
esac

Le résultat de sortie est:

Example

Sortir des boucles

Pendant une boucle, il est parfois nécessaire de forcer la sortie de la boucle avant que la condition de fin de boucle ne soit atteinte. Shell utilise deux commandes pour implémenter cette fonction :breaketcontinue。

commande break

La commande break permet de sortir de toutes les boucles (en terminant l'exécution de toutes les boucles suivantes).

Dans l'exemple suivant, le script entre dans une boucle infinie jusqu'à ce que l'utilisateur saisisse un nombre supérieur à 5. Pour sortir de cette boucle et revenir à l'invite du shell, vous devez utiliser la commande break.

Exemple

#!/bin/bash
while :
do
    echo -n "Entrez un nombre entre 1 et 5 :"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "Le nombre que vous avez saisi est$aNum!"
        ;;
        *) echo "Le nombre que vous avez saisi n'est pas entre 1 et 5 ! Partie terminée"
            break
        ;;
    esac
done

Exécutez le code ci-dessus, la sortie est :

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

continue

La commande continue est similaire à la commande break, à une différence près : elle ne sort pas de toutes les boucles, seulement de la boucle actuelle.

Modifiez l'exemple ci-dessus :

Exemple

#!/bin/bash
while :
do
    echo -n "Entrez un nombre entre 1 et 5 : "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "Le nombre que vous avez saisi est$aNum!"
        ;;
        *) echo "Le nombre que vous avez saisi n'est pas compris entre 1 et 5 !"
            continue
            echo "Partie terminée"
        ;;
    esac
done

L'exécution du code montre que lorsqu'un nombre supérieur à 5 est saisi, la boucle dans cet exemple ne se termine pas. L'instructionecho "Partie terminée"ne sera jamais exécutée.

Autres extensions