Contrôle des processus Shell


Contrairement à Java, PHP et d'autres langages, le contrôle de processus de sh ne peut pas être vide, tel que (voici comment écrire le contrôle de processus PHP) :

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // 不做任何事情
}

Ceci ne peut pas être écrit en sh /bash S'il n'y a aucune instruction à exécuter dans la branche else, n'écrivez pas ceci autrement.


if else

if

format de syntaxe de l'instruction if :

if condition
then
    command1 
    command2
    ...
    commandN 
fi

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

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

est s'il est orthographié à l'envers. Vous en rencontrerez des similaires plus tard.

if else

if else Format de grammaire :

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

if else-if else

if else-if else Format de grammaire :

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

L'exemple suivant détermine si deux variables sont égales :

a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

Résultat de sortie :

a 小于 b

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

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi

Résultat de sortie :

两个数字相等!

for loop

Similaire à 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 est dans la liste, la boucle for exécute toutes les commandes Une fois et utilise le nom de la variable pour obtenir list Valeur actuelle de . La commande peut être n’importe quelle commande et instruction shell valide. La liste d'entrée peut contenir des remplacements, des chaînes et des noms de fichiers. La liste

in est facultative Si elle n'est pas utilisée, la boucle for utilise les paramètres de position de la ligne de commande.

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

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

Résultat de la 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 de la chaîne dans l'ordre :

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

Résultat de sortie :

This is a string

l'instruction while

la boucle while est utilisée pour exécuter en continu une série de commandes et est également utilisée pour lire les données des fichiers d'entrée. Les commandes sont généralement des conditions de test ; . Le format 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, alors la condition renvoie vrai. int commence à 0 et augmente de 1 à chaque fois que la boucle est traitée. Exécutez le script ci-dessus, renvoyez les nombres 1 à 5, puis terminez.

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

Exécutez le script, sortie :

1
2
3
4
5

La commande Bash let est utilisée, qui est utilisée pour exécuter une ou plusieurs expressions. Il n'est pas nécessaire d'ajouter $ pour représenter les variables dans les calculs de variables. . Pour plus de détails, veuillez vous référer à : Commande Bash let

.

La boucle While peut être utilisée pour lire les informations du clavier. Dans l'exemple suivant, les informations d'entrée sont définies sur la variable FILM et appuyer sur <Ctrl-D> termine la boucle.

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的电影名: '
while read FILM
do
    echo "是的!$FILM 是一部好电影"
done

Exécutez le script, le résultat est similaire à ce qui suit :

按下 <CTRL-D> 退出
输入你最喜欢的电影名: w3cschoolphp中文网
是的!w3cschoolphp中文网 是一部好电影

Boucle infinie

Format de syntaxe de boucle infinie :

while :
do
    command
done

ou

while true
do
    command
done

ou

for (( ; ; ))



jusqu'à ce que la boucle

jusqu'à ce que la boucle exécute une série de commandes jusqu'à ce que la condition soit vraie et s'arrête.

Les méthodes de traitement des boucles jusqu'à et pendant que les boucles sont exactement opposées.

En général, les boucles while sont meilleures que les boucles jusqu'à, mais parfois, et seulement dans de rares cas, les boucles jusqu'à ce que soient plus utiles.

jusqu'à Format de syntaxe :

until condition
do
    command
done

La condition peut être n'importe quelle condition de test. Le test a lieu à la fin de la boucle, donc la boucle est exécutée au moins une fois - veuillez noter ceci.


case

L'instruction Shell case est une instruction à sélection multiple. Vous pouvez utiliser des instructions case pour faire correspondre une valeur et un modèle. Si la correspondance réussit, la commande correspondante est exécutée. Le format de la déclaration de cas est le suivant :

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

fonctionne comme indiqué ci-dessus. La valeur doit être suivie du mot in et chaque modèle doit se terminer par une parenthèse droite. La valeur peut être une variable ou une constante. Une fois que la correspondance a révélé que la valeur correspond à un certain modèle, toutes les commandes commencent à être exécutées jusqu'à ;;. La valeur

détectera chaque modèle correspondant. Une fois le modèle correspondant, les autres modèles ne continueront pas après l'exécution de la commande correspondante du modèle correspondant. Si aucun des modèles ne correspond, utilisez l'astérisque * pour capturer la valeur et exécutez les commandes suivantes.

Le script suivant vous invite à saisir 1 à 4 pour correspondre à chaque modèle :

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

Entrez un contenu différent, il y aura des résultats différents, par exemple :

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

Sortez de la boucle

Pendant le processus de boucle, il est parfois nécessaire de forcer une sortie de boucle lorsque la condition de fin de boucle n'est pas atteinte. Shell utilise deux commandes pour réaliser cette fonction : break et continue. .

commande break

la commande break permet de sortir de toutes les boucles (terminer 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.

#!/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

exécute le code ci-dessus, le résultat de sortie est :

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

continue

la commande continue est similaire à la commande break, avec une différence, elle ne sautera pas de tout boucles, seulement le cycle actuel.

Modifiez l'exemple ci-dessus :

#!/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

Exécutez le code et constatez que lorsqu'un nombre supérieur à 5 est saisi, la boucle dans cet exemple ne se terminera pas et l'instruction echo " Le jeu est terminé !" ne sera jamais exécuté.


esac

La syntaxe de case est très différente du langage de la famille C. Elle nécessite un esac (l'inverse de la casse) comme marque de fin, et chaque branche de case utilise un. parenthèse droite. Utilisez deux points-virgules pour indiquer une pause.