Sysop.Fr
Catégories

apache

awk

bash

charmap

date

echo

encoding

find

grep

hexdump

irc

iso3166

ls

mysql

openssh

printf

python

read

sed

seq

smpp

sort

tar

ucp

Articles

bash - boucles (while, for)

1. Boucle while

while condition
    do instruction(s)
done
            

1.1 Demander une confirmation:

cat <<EOF
+-----------------------------------------------------------------------------+
| LOGNAME:      ${LOGNAME}
| HOME:         ${HOME}
| BASH:         ${BASH}
| BASH_VERSION: ${BASH_VERSION}
| LANG:         ${LANG}
| LC_ALL:       ${LC_ALL}
+-----------------------------------------------------------------------------+
EOF

decision=0
while [ "${decision}" -ne 1 ]; do
    read -r -p "Please confirm? [Y/n] " user_input
    case $user_input in
        [yY][eE][sS]|[yY]) decision=1; echo "Yes";;
        [nN][oO]|[nN]) decision=1; echo "No"; exit 1;;
        *) echo "Invalid input...";;
    esac
done

+-----------------------------------------------------------------------------+
| LOGNAME:      toto
| HOME:         /home/toto
| BASH:         /bin/bash
| BASH_VERSION: 4.3.48(1)-release
| LANG:         en_US.UTF-8
| LC_ALL:       en_US.UTF-8
+-----------------------------------------------------------------------------+
Please confirm? [Y/n] y
Yes
            

1.2 Lire un fichier (ou un retour de commande) ligne par ligne:

#!/bin/bash
while read -r line; do
    echo -e "$line\n"
done < file.txt
            
#!/bin/bash
while read -r user shell; do
    echo "user=${user} and shell=${shell}"
done <<< "$(awk -F":" '{print $1,$7}' /etc/passwd)"

user=root and shell=/bin/bash
user=daemon and shell=/usr/sbin/nologin
user=bin and shell=/usr/sbin/nologin
user=sys and shell=/usr/sbin/nologin
            
Voir aussi la commande read

2. Boucle for

2.1 Boucle for avec liste de valeurs

for variable in liste_valeurs; do
    instruction(s)
done

#!/bin/bash
semaine="samedi dimanche"
for jour in ${semaine}; do
    echo "${jour}"
done
samedi
dimanche
            

2.2 Boucle for avec expressions arithmétiques

for ((e1;e2;e3)); do
    instruction(s)
done

Dans laquelle, e1, e2 et e3 sont des expressions arithmétiques. Une telle boucle commence par exécuter l'expression e1, puis tant que l'expression e2 est différente de zéro le bloc d'instructions est exécuté et l'expression e3 évaluée.

#!/bin/bash
for ((i=0 ; $i <= 20; i++)); do
    echo "i = ${i}"
    if [ `echo "${i} % 10" | bc` -eq 0 ]; then
        echo "i est un multiple de 10"
    fi
done
i = 0
i est un multiple de 10
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
i est un multiple de 10
i = 11
i = 12
i = 13
i = 14
i = 15
i = 16
i = 17
i = 18
i = 19
i = 20
            

3. break et continue

La commande break permet de sortir d'une boucle. La commande continue permet de reprendre à la prochaine itération de la boucle.

while true; do
    read -r -p "Please confirm? [Y/n] " user_input
    case $user_input in
        [yY][eE][sS]|[yY]) echo "Yes"; break;;
        [nN][oO]|[nN]) echo "No"; exit 1;;
        *) echo "Invalid input..."; continue;;
    esac
done