Structures de contrôle (if - for - while - until - case)

Mise à jour : Debian 10.0 Buster

Sommaire

1 - Principe

Le conditionnement des opérations en fonction des résultats d'un test peut s'effectuer

$ <test> && ..... || .....

par exemple

$ blkid && .... || .....

$ [[ 4 = 8 ]] && ...... || ..........
$ if <test>; then .... ; else ..... ; fi

par exemple

$ if lsblk; then ....; else ....., fi

$ if [[ 4 = 8 ]]; then .....; else ..........;fi

2 - Conditions

2.1 - Opérateurs d'enchaînement conditionnels

Principe

A && B             Exécuter B si A réussit
A || B             Exécuter B si A échoue
A && B || C Exécuter B si A réussit, exécuter C si A échoue

Exemple

$ [[ 5 = 8 ]] && echo "5 = 8 vrai" || echo "5 = 8 faux"
5 = 8 faux

2.2 - if then else

if test; then
Commande_à_effectuer_si_test_réussit
else
Commande_à_effectuer_si_test_échoue
fi
$ if [[ 5 = 8 ]]; then echo 5 = 8 vrai; else echo 5 = 8 faux; fi
5 = 8 faux

2.3 - case in esac

$ case $Variable in
        valeur1) Commande_1;;
        valeur2) Commande_2;;
        valeur3) Commande_3;;
....
*) Commande pour toute autre valeur);; esac
$ read a;case "$a" in  1) echo un;; 2) echo deux;; 3) echo trois;; *) echo inconnu;; esac
1
un
$ read a;case "$a" in 1) echo un;; 2) echo deux;; 3) echo trois;; *) echo inconnu;; esac
3
trois
$ read a;case "$a" in 1) echo un;; 2) echo deux;; 3) echo trois;; *) echo inconnu;; esac
5
inconnu

3 - Boucles for - while - until

3.1 - for do done

for Liste
do Commande_à_effectuer
done

Exemples de liste

$ for i in {1..4} ; do echo $i ; done
1
2
3
4

# Incrément de 1
$ for ((i = 1; i <= 10; i++)); do echo $i; done
1
2
3
4
....

# Décrément de 1
$ for ((i = 10; i >= 1; i--)); do echo $i;done
10
9
8
7
...

# Incrément de 3
$ for ((i = 1; i <= 10; i+=3)); do echo $i; done
1
4
7
10

# Multiplication par 2
$ for ((i = 1; i <= 10; i*=2)); do echo $i; done
1
2
4
8

# Progression définie par une formule de calcul
$ for ((i = 1; i <= 160; i = 5*i+2)); do echo $i; done
1
7
37
$ for i in {f..j}; do echo $i ;done
f
g
h
i
j
$ for i in {1,5,z,T}; do echo $i; done
1
5
z
T
$ for i in *d*;do echo $i;done
data
Downloads
nuc_buster_luksheader_BU
nuc_data_luksheader_BU
$ for i in $(date) ;do echo $i;done
mercredi
11
décembre
2019,
12:30:33
(UTC+0100)
$ for i in $(echo ceci est une longue histoire);do echo $i;done
ceci
est
une
longue
histoire
$ for i in $(cat /etc/apt/sources.list);do echo $i;done
#
buster
deb
http://deb.debian.org/debian/
buster
main
non-free
contrib
deb-src
......
$ cat /etc/apt/sources.list |while IFS= read -r line; do printf "%s\n" "$line";done
# bullseye
deb http://deb.debian.org/debian/ bullseye main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye main non-free contrib

# bullseye-updates, previously known as 'volatile
.....

3.2 - while do done

while Test; do 
Commande_à_effectuer_tant_que_le_test_réussit
done

Exemples

$ a=0;while [[ $a -lt 10 ]];do read -p "Entrer un nombre " a; done
2
5
8
12
$ cat /etc/apt/sources.list |while read i ; do echo $i ;done
# buster

deb http://deb.debian.org/debian/ buster main non-free contrib
deb-src http://deb.debian.org/debian/ buster main non-free contrib
....

3.3 - until do done

3.3 - until do done

until Test; do
Commande_à_effectuer_tant_que_le_test_ne_réussit_pas
done
$ a=20;until [[ "$a" -lt 10 ]];do read -p "Entrer un nombre " a; done
15
12
8

4 - Modification du déroulement d'une boucle

4.1 - break

$ while true; do break; done
$ while true; do while true; do break 2;done;done

4.2 - continue

$ for i in {0..9};do { (( $i <  5 )) && continue; echo "$i - Fin de la boucle"; }; done 
5 - Fin de la boucle
6 - Fin de la boucle
7 - Fin de la boucle
8 - Fin de la boucle
9 - Fin de la boucle