Expressions conditionnelles dans le shell Bash

Niraj Menon 30 janvier 2023
  1. La déclaration if dans Bash
  2. Conditionnels Bash intégrés
Expressions conditionnelles dans le shell Bash

Bash en tant que langage de programmation n’est pas la référence de la plupart des programmeurs, en particulier avec des langages beaucoup plus courants comme Python et C.

Il est utile d’écrire des constructions de programmation pour exécuter des commandes basées sur des critères avec des instructions if ou la même commande avec plusieurs arguments en utilisant une boucle for.

Ce didacticiel passera en revue les instructions if de Bash, en se concentrant sur les types d’expressions conditionnelles utilisées dans les instructions if.

La déclaration if dans Bash

La syntaxe générale de l’instruction if dans Bash est la suivante.

if condition; then
    do-if-true;
elif second-condition; then
    do-else-if-true
elif third-condition; then
    do-else-if-third-true
else
    do-else-false
fi

Les conditions elles-mêmes peuvent avoir une syntaxe différente, selon la condition requise.

  • Si vous souhaitez utiliser la sortie d’une commande comme condition, telle que grep le contenu d’un fichier pour voir s’il contient une certaine sous-chaîne, vous pouvez placer la commande après le mot-clé if, comme suit.
if greq -q "string" file.txt; then
    echo "string exists in file.txt."
else
    echo "string does not exist in file.txt."
fi
  • [ "$s" = "string" ] vérifie si la variable $s contient la valeur string. C’est aussi équivalent à test "$s" = "string", où test remplace effectivement les crochets.
if [ "$s" = "string" ]; then
    echo "string is equivalent to \$s"
else
    echo "string is not equivalent to \$s"
fi
  • Vous pouvez même effectuer des opérations arithmétiques, comme vérifier si le nombre attendu de fichiers ou de lignes dans un fichier est certain ou si le nombre dans un répertoire est inférieur ou supérieur à celui d’un autre répertoire.

    Nous faisons cela avec des paires de parenthèses.

a=$(ls dir_a | wc -l)
b=$(ls dir_b | wc -l)
if (( a < b )); then
    echo "Directory a has fewer files than directory b."
elif (( a > b )); then
    echo "Directory a has more files than directory b."
else
    echo "Directory a has the same number of files as that of directory b."
fi

Conditionnels Bash intégrés

Parfois, l’exécution d’un programme séparé pour vérifier quelque chose d’aussi simple que l’existence d’un fichier, les dates de modification et les tailles est fastidieuse et consommatrice de ressources, de sorte que Bash peut vérifier directement ces attributs comme des instructions if.

Les indicateurs suivants vérifient l’existence ou la non-existence de ces attributs, renvoyant un résultat effectivement vrai ou faux à l’instruction if.

Par exemple, pour vérifier si une commande n’a produit aucune sortie, nous pouvons traiter sa sortie comme une chaîne et vérifier si la longueur de cette chaîne est nulle avec le drapeau -z, comme suit.

out=$(bash print-if-error.sh)
if [[ -z $out ]]; then
    echo "The script ran successfully."
else
    echo "The script produced the following errors: "
    echo $out
fi

Pour obtenir l’inverse de la condition, vous pouvez soit utiliser le ! NOT, ou utilisez la forme inverse de cet indicateur, qui est soit -n, soit aucun indicateur, car une chaîne non vide peut se comporter comme “true” dans une instruction Bash if.

out=$(bash print-if-error.sh)
if [[ $out ]]; then
    echo "The script produced the following errors: "
    echo $out
else
    echo "The script ran successfully."
fi

Certains autres drapeaux utiles sont expliqués ci-dessous, avec des explications référencées dans le Manuel de référence de GNU Bash.

  1. -f vérifie si le fichier existe et s’il s’agit d’un fichier normal.
  2. -d vérifie si l’argument fourni était un répertoire.
  3. -h vérifie si l’argument fourni était un lien symbolique.
  4. -s vérifie si le fichier existe et n’est pas vide.
  5. -r vérifie si le fichier est lisible.
  6. -w vérifie si le fichier est accessible en écriture.
  7. -x vérifie si le fichier est exécutable.

Pour les drapeaux qui prennent deux arguments, comme les opérateurs de comparaison, le premier argument vient avant le drapeau tandis que le second apparaît après le drapeau.

Supposons que nous comparions deux fichiers - a.txt et b.txt - pour voir lequel est le plus récent, avec le drapeau -nt. L’inverse vérifiera s’il est plus ancien, avec -ot.

out=$(bash print-if-error.sh)
if [[ a.txt -nt b.txt ]]; then
    echo "a.txt is newer than b.txt."
else
    echo "a.txt is older or the same age as b.txt."
fi

D’autres indicateurs à deux opérandes de ce type sont les suivants.

  1. -ef garantit que les deux arguments font référence aux mêmes numéros de périphérique et d’inode.
  2. != garantit que les deux arguments ne sont pas égaux.
  3. < vérifie que le premier argument est alphabétiquement avant le second.
  4. > vérifie que le premier argument est alphabétiquement après le second.
  5. -eq suppose que les deux arguments sont des entiers et vérifie qu’ils sont égaux.
  6. -ne suppose que les deux arguments sont des entiers et vérifie qu’ils ne sont pas égaux.
  7. -lt suppose que les deux arguments sont des entiers et vérifie que le premier est inférieur au second. On peut utiliser -le pour vérifier s’ils sont égaux.
  8. -gt suppose que les deux arguments sont des entiers et vérifie que le premier est supérieur au second. On peut utiliser -ge pour vérifier s’ils sont égaux.

Article connexe - Bash Condition