GNU/Linux >> Tutoriels Linux >  >> Linux

Bash Beginner Series #7 :Prise de décision avec des instructions If Else et Case Statements

Rendons nos scripts bash intelligents !

Dans cette partie de la série bash pour débutants, vous apprendrez à utiliser des instructions conditionnelles dans vos scripts bash pour qu'ils se comportent différemment dans différents scénarios et cas.

De cette façon, vous pouvez créer des scripts bash beaucoup plus efficaces et vous pouvez également implémenter la vérification des erreurs dans vos scripts.

Utilisation de l'instruction if dans bash

La construction la plus fondamentale dans toute structure de prise de décision est une condition si. La syntaxe générale d'une instruction if de base est la suivante :

if [ condition ]; then
  your code
fi

Le if l'instruction est fermée par un fi (inverse de si).

Faites attention aux espaces blancs !

  • Il doit y avoir un espace entre les crochets ouvrant et fermant et la condition que vous écrivez. Sinon, le shell se plaindra d'une erreur.
  • Il doit y avoir un espace avant et après l'opérateur conditionnel (=, ==, <=etc). Sinon, vous verrez une erreur du type "opérateur unaire attendu".

Maintenant, créons un exemple de script root.sh. Ce script fera écho à la déclaration "vous êtes root" uniquement si vous exécutez le script en tant qu'utilisateur root :

#!/bin/bash

if [ $(whoami) = 'root' ]; then
	echo "You are root"
fi

Le whoami La commande affiche le nom d'utilisateur. D'après le tutoriel sur les variables bash, vous savez que $(command) La syntaxe est utilisée pour la substitution de commande et elle vous donne la sortie de la commande.

La condition $(whoami) = 'root' ne sera vrai que si vous êtes connecté en tant qu'utilisateur root.

Vous ne me croyez pas ? Vous n'êtes pas obligé. Exécutez-le et voyez par vous-même.

Utilisation de l'instruction if-else dans bash


Vous avez peut-être remarqué que vous n'obtenez aucune sortie lorsque vous exécutez le root.sh script en tant qu'utilisateur régulier. Tout code que vous souhaitez exécuter lorsqu'une condition if est évaluée comme fausse peut être inclus dans une instruction else comme suit :

#!/bin/bash

if [ $(whoami) = 'root' ]; then
	echo "You are root"
else
	echo "You are not root"
fi

Maintenant, lorsque vous exécutez le script en tant qu'utilisateur normal, il vous sera rappelé que vous n'êtes pas l'utilisateur root tout-puissant :

[email protected]:~$ ./root.sh
You are not root

Utiliser l'instruction else if dans bash

Vous pouvez utiliser une instruction elif (else-if) chaque fois que vous souhaitez tester plusieurs expressions (conditions) en même temps.

Par exemple, le suivant age.sh Le script bash prend votre âge comme argument et affichera un message significatif correspondant à votre âge :

#!/bin/bash

AGE=$1

if [ $AGE -lt 13 ]; then
	echo "You are a kid."
elif [ $AGE -lt 20 ]; then
	echo "You are a teenager."
elif [ $AGE -lt 65 ]; then
	echo "You are an adult."
else
	echo "You are an elder."
fi

Faites maintenant quelques exécutions de age.sh script à tester avec différents âges :

[email protected]:~$ ./age.sh 11
You are a kid.
[email protected]:~$ ./age.sh 18
You are a teenager.
[email protected]:~$ ./age.sh 44
You are an adult.
[email protected]:~$ ./age.sh 70
You are an elder.

Notez que j'ai utilisé le -lt (inférieur à) condition de test avec la variable $AGE.

Sachez également que vous pouvez avoir plusieurs elif déclarations mais un seul else instruction dans une construction if et elle doit être fermée par un fi .

Utilisation d'instructions if imbriquées dans bash

Vous pouvez également utiliser une instruction if dans une autre instruction if. Par exemple, jetez un œil au fichier suivant weather.sh script bash :

#!/bin/bash

TEMP=$1

if [ $TEMP -gt 5 ]; then
	if [ $TEMP -lt 15 ]; then
		echo "The weather is cold."
	elif [ $TEMP -lt 25 ]; then
		echo "The weather is nice."
	else
		echo "The weather is hot."
	fi
else
	echo "It's freezing outside ..."
fi

Le script prend n'importe quelle température comme argument, puis affiche un message qui reflète le temps qu'il ferait. Si la température est supérieure à cinq, l'instruction if-elif imbriquée (interne) est évaluée. Faisons quelques exécutions du script pour voir comment cela fonctionne :

[email protected]:~$ ./weather.sh 0
It's freezing outside ...
[email protected]:~$ ./weather.sh 8
The weather is cold.
[email protected]:~$ ./weather.sh 16
The weather is nice.
[email protected]:~$ ./weather.sh 30
The weather is hot.

Utilisation de l'instruction Case dans bash

Vous pouvez également utiliser des instructions case dans bash pour remplacer plusieurs instructions if car elles sont parfois déroutantes et difficiles à lire. La syntaxe générale d'une construction de cas est la suivante :

case "variable" in
	"pattern1" )
		Command … ;;
	"pattern2" )
		Command … ;;
	"pattern2" )
		Command … ;;
esac

Attention !

  • Les motifs sont toujours suivis d'un espace vide et de ) .
  • Les commandes sont toujours suivies d'un double point-virgule ;; . L'espace blanc n'est pas obligatoire avant.
  • Les instructions de cas se terminent par esac (inverse de la casse).

Les instructions case sont particulièrement utiles lorsqu'il s'agit de correspondance de modèles ou d'expressions régulières. Pour démontrer, regardez le char.sh suivant script bash :

#!/bin/bash

CHAR=$1

case $CHAR in
[a-z])
echo "Small Alphabet." ;;
[A-Z])
echo "Big Alphabet." ;;
[0-9])
echo "Number." ;;
*)
echo "Special Character."
esac

Le script prend un caractère comme argument et indique s'il s'agit d'un petit/grand alphabet, d'un chiffre ou d'un caractère spécial.

[email protected]:~$ ./char.sh a
Small Alphabet.
[email protected]:~$ ./char.sh Z
Big Alphabet.
[email protected]:~$ ./char.sh 7
Number.
[email protected]:~$ ./char.sh $
Special Character.

Notez que j'ai utilisé le symbole astérisque générique (*) pour définir le cas par défaut qui est l'équivalent d'une instruction else dans une condition if.

Conditions de test en bash

Il existe de nombreuses conditions de test que vous pouvez utiliser avec les instructions if. Les conditions de test varient selon que vous travaillez avec des nombres, des chaînes ou des fichiers. Considérez-les comme des opérateurs logiques dans bash.

J'ai inclus certaines des conditions de test les plus populaires dans le tableau ci-dessous :

État Équivalent
$a -lt $b $a <$b
$a -gt $b $a> $b
$a -le $b $a <=$b
$a -ge $b $a>=$b
$a -eq $b $a est égal à $b
$a -ne $b $a n'est pas égal à $b
-e $FILE $FILE existe
-d $FILE $FILE existe et est un répertoire.
-f $FILE $FILE existe et est un fichier normal.
-L $FILE $FILE existe et est un lien symbolique.
$STRING1 =$STRING2 $STRING1 est égal à $STRING2
$STRING1 !=$STRING2 $STRING1 n'est pas égal à $STRING2
-z $STRING1 $STRING1 est vide

Heureusement, vous n'avez pas besoin de mémoriser les conditions de test, car vous pouvez les rechercher dans la page de manuel de test :

[email protected]:~$ man test

Créons un dernier script nommé filetype.sh qui détecte si un fichier est un fichier normal, un répertoire ou un lien symbolique :

#!/bin/bash

if [ $# -ne 1 ]; then
	echo "Error: Invalid number of arguments"
 	exit 1
fi

file=$1

if [ -f $file ]; then
	echo "$file is a regular file."
elif [ -L $file ]; then
	echo "$file is a soft link."
elif [ -d $file ]; then
	echo "$file is a directory."
else
	echo "$file does not exist"
fi

J'ai un peu amélioré le script en ajoutant une vérification du nombre d'arguments. S'il n'y a pas d'arguments ou plus d'un argument, le script affichera un message et se terminera sans exécuter le reste des instructions dans le script.

Faisons quelques exécutions du script pour le tester avec différents types de fichiers :

[email protected]:~$ ./filetype.sh weather.sh
weather.sh is a regular file.
[email protected]:~$ ./filetype.sh /bin
/bin is a soft link.
[email protected]:~$ ./filetype.sh /var
/var is a directory.
[email protected]:~$ ./filetype.sh 
Error: Invalid number of arguments

Bonus :Bash if else sur une ligne

Jusqu'à présent, toutes les instructions if else que vous avez vues ont été utilisées dans un script bash approprié. C'est la façon décente de le faire, mais vous n'y êtes pas obligé.

Lorsque vous souhaitez simplement voir le résultat dans le shell lui-même, vous pouvez utiliser les instructions if else sur une seule ligne dans bash.

Supposons que vous ayez ce script bash.

if [ $(whoami) = 'root' ]; then
	echo "You are root"
else
	echo "You are not root"
fi

Vous pouvez utiliser toutes les instructions if else sur une seule ligne comme ceci :

if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi

Vous pouvez copier et coller ce qui précède dans le terminal et voir le résultat par vous-même.

Fondamentalement, vous ajoutez simplement des points-virgules après les commandes, puis ajoutez la prochaine instruction if-else.

Génial! Cela devrait vous donner une bonne compréhension des instructions conditionnelles dans Bash. J'espère que vous avez aimé rendre vos scripts bash plus intelligents !

Vous pouvez tester vos connaissances nouvellement acquises en pratiquant quelques exercices simples de bash dans le PDF ci-dessous. Il inclut également la solution.

Bash Chapter 7 Practice QuestionsProblems et leur solution pour mettre en pratique ce que vous venez d'apprendre dans ce chapitreBash-Chapter-7-Practice-Questions-Linux-Handbook.pdf31 KB

Restez à l'écoute la semaine prochaine car vous apprendrez à utiliser diverses constructions de boucles dans vos scripts bash.


Linux
  1. Rendre les ordinateurs plus accessibles et durables avec Linux

  2. Comment programmer avec Bash :syntaxe et outils

  3. Naviguer dans le shell Bash avec pushd et popd

  4. Bash Beginner Series #9 :Utiliser des fonctions dans Bash

  5. Bash Beginner Series #8 :Boucles dans Bash

Bash Beginner Series #5 :Utilisation des opérateurs arithmétiques dans les scripts Bash

Bash Beginner Series #4 :Utiliser des tableaux dans Bash

Bash Beginner Series #3 :Passer des arguments aux scripts Bash

Bash Beginner Series #6 :Opérations sur les chaînes dans Bash

Bash Beginner Series #10 :Automatisation avec Bash

Comprendre Bash If Else et d'autres instructions conditionnelles