Boucles
Les boucles sont un moyen de répéter une séquence de code autant de fois que nécessaire.
Imagine que tu veuilles créer les fichiers day_0.txt day_1.txt day_2.txt etc. jusqu'à day_10.txt. Tu ne vas quand même pas écrire les noms de ces 11 fichiers dans ton script ?
while
while a une iou plusieurs conditions, et le code de la condition sera répété tant que la condition est Vraie.
#!/bin/sh
i=0
while [ i -le 10 ]
do
touch day_${i}.txt
i=$((i + 1))
done
Ce code va créer la liste des fichiers day_0.txt jusqu'à day_10.txt.
Essaie maintenant de modifier le script pour le rendre plus modulable. Tu dois utiliser des arguments pour :
- Avoir un nom de fichier différent que day
- Partir d'un nombre de départ différent que 0
- Finir à un nombre différent que 10. Attention, le nombre de fin doit être strictement supérieur que le nombre de départ
- Avoir une extension différent que txt
Voici un exemple de corrigé :
#!/bin/sh
if [ $# -ne 4 ]
then
echo "Usage: $0 FILENAME START STOP EXTENSION" >&2
exit 1
fi
if [ "$3" -le "$2" ]
then
echo "Le nombre de départ doit être strictement supérieur que le nombre de fin" >&2
exit 1
fi
filename=$1
start=$2
stop=$3
extension=$4
while [ "$start" -le "$stop" ]
do
touch "${filename}_${start}.${extension}"
start=$((start + 1))
done
On peut tester l'environnement du système. Par exemple, tant qu'un répertoire n'existe pas, on boucle sur un message d'erreur.
#!/bin/sh
while [ ! -d ventre ]
do
echo "Le répertoire 'ventre' n'existe pas"
done
touch ventre/gateau_chocolat
touch ventre/gateau_caramel
touch ventre/gateau_vanille
touch ventre/gateau_pistache
echo "Burp"
Il faut utiliser un deuxième shell pour créer le répertoire.
Lire un fichier ligne par ligne
Il est possible de lire un fichier ligne par ligne avec une boucle while.
#!/bin/sh
if [ ! -f input_file ]
then
echo "input_file n'existe pas" >&2
exit 1
fi
while read line
do
echo "La ligne est: $line"
done < input_file
Evidemment, tu peux remplacer input_file par un paramètre.
until
until est exactement la même chose que while, à la différence que le code exécuté est répété tant que la condition est Fausse. Plus exactement, jusqu'à ce qu'elle soit Vraie.
#!/bin/sh
i=0
# Tant que i n'égale pas 10, on exécute le code de la boucle
until [ $i -eq 10 ]
do
echo $i
i=$((i + 1))
done
for
for sert à boucler sur une séquence. Avec un point de départ, un point de fin.
Tu peux boucler sur un ensemble d'éléments, ou une séquence de nombres.
#!/bin/sh
for element in je suis un sequence
do
echo $element
done
Tu peux boucler sur des séquences générées en pure shell.
#!/bin/sh
for element in {a..z}
do
echo $element
done
Pour les nombres il y a une différence. Je te laisse tester toutes ces différences :
#!/bin/sh
# De 1 à 20 par pas de 1
for nombre in {1..20}
do
echo $nombre
done
# De 1 à 20 par pas de 4
for nombre in {1..20..4}
do
echo $nombre
done
# De 20 à 1 par pas de 1
for nombre in {20..1}
do
echo $nombre
done
# De 20 à 1 par pas de 6
for nombre in {20..1..6}
do
echo $nombre
done
Tu peux aussi boucler sur les paramètres. Tu vas ici comprendre la différence entre $@ et $*
Teste les scripts avec au moins deux paramètres.
#!/bin/sh
for arg in $@
do
echo $arg
done
#!/bin/sh
for arg in $*
do
echo $arg
done
Jusqu'ici, aucune différence. Ajoute maintenant les variables entre double quotes.
#!/bin/sh
for arg in "$@"
do
echo $arg
done
#!/bin/sh
for arg in "$*"
do
echo $arg
done
Tu peux maintenant voir la différence. $@ reste une liste alors que $* devient un seul argument.