MagPI 10 Page 18
Le tableau ci-dessous présente les tests logiques qui peuvent être appliqués aux variables :
Syntaxe | Explication |
---|---|
-z chaîne | Vrai si la chaîne est vide |
-n chaîne | Vrai si la chaîne n'est pas vide |
var1 == var2 | Vrai si égal |
var1 != var2 | Vrai si différent |
Les comparaisons logiques d'égalité et de différence peuvent aussi être utilisées avec des jokers, pour tester si une sous-chaîne est présente dans une autre chaîne.
#!/bin/bash str1="Raspberry" str2="berry" if [[ $str1 == "$str2"* ]]; then echo "$str1 commence par $str2" fi if [[ $str1 == *"$str2" ]]; then echo "$str1 se termine par $str2" fi if [[ $str1 == *"$str2"* ]]; then echo "$str1 contient $str2" fi
La boucle 'for'
Bash fournit nombre de structures de boucles familières. La boucle for est le plus souvent utilisée avec des fichiers ou des variables en entrée :
#!/bin/bash # Une chaîne avec des valeurs séparées par des espaces list="a b c" # affiche chaque caractère de la variable 'list'. for l in $list; do echo $l done
On peut aussi l'écrire en une seule ligne comme suit :
list="a b c"; for l in $list; do echo $l; done
Où les retours à la ligne du script sont remplacés par des points-virgules. La variable contenant la liste peut être remplacée par un fichier :
#!/bin/bash # Remplit un fichier avec des chaînes echo "Pomme Orange" > list # Vide et concatène echo "Poire" >> list # Concatène # affiche chaque mot du fichier source. for l in $(<list); do echo $l done
Cet exemple utilise la redirection d'un fichier source pour lire chaque mot. Bash sépare les mots à l'aide de caractères espace ou retour à la ligne.
La boucle for supporte aussi la syntaxe des itérations du C :
#!/bin/bash # Affiche tous les nombres de 1 à 10 for (( i=1; i<=10; i++ )); do echo $i done
On notera que la variable i n'est pas préfixée par un signe dollar dans les parenthèses (()) de la boucle for. C'est une exception de ce type de boucle for.
Commandes d'évaluation
Une commande peut être évaluée en l'écrivant à l'intérieur de $(). Par exemple :
dir_list=$(ls)
Remplit la variable dir_list avec le texte renvoyé par la commande ls. La syntaxe $() peut être utilisée directement comme variable. Cela peut s'avérer utile dans une boucle :
#!/bin/bash for file in $(ls *.txt); do gzip $file done
Cet exemple compresse avec gzip tous les fichiers texte du répertoire de travail.
Les commandes d'évaluation peuvent être imbriquées :
touch /tmp/t1 # Crée un fichier vide $(basename $(ls /tmp/t1)) # Nom du fichier sans le répertoire
Il peut aussi inclure des variables :
file=/tmp/t1 $(basename $(ls $file))
Les commandes peuvent comporter des opérateurs tubes :
files_to_gzip=$(ls * | grep -v .gz)
Cette commande exclut les fichiers dont le nom termine par ".gz". L'opérateur tube "|" passe la sortie standard d'une commande à l'entrée standard de la suivante.
Challenge
Écrire un programme pour compresser avec gzip tous les fichiers du répertoire courant. Ce programme ne doit pas compresser les fichiers dont le nom se termine par ".gz". La solution de ce problème sera donnée dans le prochain tutoriel.