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

Contrôle de flux Shell

Contrôle de flux Shell

Unlike languages such as Java and PHP, sh flow control cannot be empty, as shown below (this is the PHP flow control writing style):

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // do nothing
}

in sh/In bash, you can't write it like this, and if there are no statements to be executed in the else branch, don't write this else.

if else

fi

if statement syntax format:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

written on one line (for terminal command prompt):

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

The final fi is the reverse spelling of if, and you will encounter similar ones later.

if else

if else syntax format:

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

if else-if else

if else-if else syntax format:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

The following example checks if two variables are equal:

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

输出结果:

a est inférieur à b

if else statements are often used with the test command, as shown below:

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

输出结果:

两个数字相等!

for循环

与其他编程语言类似,Shell支持for循环。

for循环一般格式为:

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

写成一行:

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

当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。

in列表是可选的,如果不用它,for循环使用命令行的位置参数。

例如,顺序输出当前列表中的数字:

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

输出结果:

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

顺序输出字符串中的字符:

#!/bin/bash
for str in This is a string
do
    echo $str
done

输出结果:

This
is
a
string

while语句

while循环用于不断执行一系列命令,也用于从输入文件中读取数据。其语法格式为:

while condition
do
    command
done

以下是一个基本的 while 循环,测试条件是:如果 int 小于等于 5,那么条件返回真。int 从 1 开始,每次循环处理时,int 加 1。运行上述脚本,返回数字 1 à 5,然后终止。

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

运行脚本,输出:

1
2
3
4
5

以上示例使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令

while循环可用于读取键盘信息。下面的实例中,输入信息被设置为变量FILM,按<Ctrl-D> 结束循环。

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

运行脚本,输出类似下面:

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

无限循环

语法格式:无限循环

while :
do
    command
done

ou}}

while true
do
    command
done

ou}}

for (( ; ; ))

Boucle until

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

La boucle until fonctionne de manière opposée à la boucle while.

Généralement, la boucle while est préférable à la boucle until, mais dans certains cas, la boucle until peut être plus utile.

Le format syntaxique de until :

until condition
do
    command
done

La condition est généralement une expression conditionnelle. Si le retour est faux, les instructions du corps de la boucle sont exécutées à nouveau. Sinon, la boucle est terminée.

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

#!/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 la sortie est :

0
1
2
3
4
5
6
7
8
9

case ... esac

case ... esac C'est une instruction de choix multiple, similaire aux instructions switch ... case d'autres langages. C'est une structure de choix multi-branches. Chaque branche de case commence par une parenthèse droite, et est terminée par deux points-virgules ;; pour indiquer la fin de l'exécution et sortir de l'instruction case ... esac. La fin de l'instruction est marquée par esac (c'est-à-dire le contraire de case).

On peut utiliser l'instruction case pour correspondre à une valeur avec un modèle. Si une correspondance réussit, la commande correspondante est exécutée.

case ... esac Le format syntaxique est le suivant :

case \
mode1)
    command1
    command2
    ...
    commandN
    ;;
mode2)
    command1
    command2
    ...
    commandN
    ;;
esac

La manière de fonctionner est similaire à celle montrée ci-dessus, la valeur doit toujours suivre le mot-clé in

La valeur sera vérifiée pour chaque modèle. Une fois un modèle correspondant trouvé, les commandes associées à ce modèle sont exécutées et le processus ne continue pas avec d'autres modèles. Si aucun modèle ne correspond, l'astérisque (*) est utilisé. Chaque modèle doit se terminer par un parenthèse droite. La valeur peut être une variable ou une constante. Une fois qu'une correspondance est trouvée, toutes les commandes entre cette valeur et ;; sont exécutées. * Capturez cette valeur puis exécutez la commande suivante.

Le script suivant invite à saisir 1 à 4et chaque modèle :

echo 'Saisissez' 1 à 4 entre :
echo 'Vous avez saisi le nombre :'
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 rien saisi' 1 à 4 les nombres entre :
    ;;
esac

Les résultats varient en fonction du contenu entré, par exemple :

Entrer 1 à 4 entre les nombres:
Le nombre que vous avez saisi est :
3
Vous avez choisi : 3

Le script suivant correspond à une chaîne de caractères :

#!/bin/sh
site=\3codebox"
case \
   "w3codebox") echo "基础教程网" 
   ;;
   "google") echo "Google 搜索" 
   ;;
   "taobao") echo "淘宝网" 
   ;;
esac

Le résultat de la sortie est :

Tutoriel de base du site web

Sortir de la boucle

Dans le processus de boucle, parfois, il est nécessaire de sortir de la boucle force avant d'atteindre la condition de fin de boucle, Shell utilise deux commandes pour réaliser cette fonction : break et continue.

Commande break

La commande break permet de sauter toutes les boucles (arrêter l'exécution de toutes les boucles suivantes).

Dans cet exemple, le script entre dans une boucle infinie jusqu'à ce que l'utilisateur entre un nombre supérieur à5. Pour sortir de ce boucle, retourner à l'invite de shell, il faut utiliser la commande break.

#!/bin/bash
while :
do
    echo -n "Entrer 1 à 5 entre les nombres :"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "Le nombre que vous avez entré est $aNum!"
        ;;
        *) echo "Le nombre que vous avez entré n'est pas 1 à 5 entre les "! Fin du jeu"
            break
        ;;
    esac
done

En exécutant le code ci-dessus, le résultat de la sortie est :

Entrer 1 à 5 entre les nombres:3
Le nombre que vous avez entré est 3!
Entrer 1 à 5 entre les nombres:7
Le nombre que vous avez entré n'est pas 1 à 5 entre les "! Fin du jeu"

continue

La commande continue est similaire à la commande break, mais avec une seule différence, elle ne quitte pas tous les boucles, mais seulement la boucle actuelle.

Modifier l'exemple ci-dessus :

#!/bin/bash
while :
do
    echo -n "Entrer 1 à 5 entre les nombres: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "Le nombre que vous avez entré est $aNum!"
        ;;
        *) echo "Le nombre que vous avez entré n'est pas 1 à 5 entre les "!"
            continue
            echo "Fin du jeu"
        ;;
    esac
done

En exécutant le code, on découvre que lorsque l'entrée est supérieure à5si, le boucle dans cet exemple ne se termine pas, la phraseecho "Fin du jeu"Ne sera jamais exécuté.