L'instruction case du shell bash est similaire à l'instruction switch en C. Elle peut être utilisée pour tester des valeurs simples comme des entiers et caractères.
L'instruction case n'est pas une boucle, elle n'exécute pas un bloc de code n fois. Au lieu de cela, bash shell vérifie la condition et contrôle le déroulement du programme.
Dans cet article, passons en revue la commande bash case avec 5 exemples pratiques.
La construction case dans bash shell nous permet de tester des chaînes par rapport à des modèles pouvant contenir des caractères génériques. L'instruction bash case est la forme la plus simple de l'instruction bash if-then-else.
Syntaxe de l'instruction bash case.
case expression in pattern1 ) statements ;; pattern2 ) statements ;; ... esac
Voici les points clés des déclarations de cas bash :
- La déclaration de cas développe d'abord l'expression et essaie de la faire correspondre à chaque modèle.
- Lorsqu'une correspondance est trouvée, toutes les instructions associées jusqu'au double point-virgule (;;) sont exécutées.
- Après la première correspondance, le cas se termine avec le statut de sortie de la dernière commande exécutée.
- S'il n'y a pas de correspondance, le statut de sortie du dossier est zéro.
Exemple de cas bash 1. Envoi d'un signal à un processus
Le script suivant accepte le numéro de signal et l'identifiant de processus comme arguments, et envoie le signal à un identifiant de processus donné en utilisant le nom du signal.
Ce script sert à démontrer l'utilisation de l'instruction case.
$ cat signal.sh #!/bin/bash if [ $# -lt 2 ] then echo "Usage : $0 Signalnumber PID" exit fi case "$1" in 1) echo "Sending SIGHUP signal" kill -SIGHUP $2 ;; 2) echo "Sending SIGINT signal" kill -SIGINT $2 ;; 3) echo "Sending SIGQUIT signal" kill -SIGQUIT $2 ;; 9) echo "Sending SIGKILL signal" kill -SIGKILL $2 ;; *) echo "Signal number $1 is not processed" ;; esac
Dans l'exemple ci-dessus :
- $1 et $2 sont respectivement le numéro de signal et l'identifiant de processus.
- En utilisant la commande kill, il envoie le signal correspondant à l'ID de processus donné.
- Il exécute la commande sleep pendant un certain nombre de secondes.
- La dernière comparaison facultative *) est un cas par défaut et qui correspond à n'importe quoi.
Utilisation du script shell ci-dessus :découvrez l'identifiant de processus de la commande sleep et envoyez un signal d'arrêt à cet identifiant de processus pour tuer le processus.
$ sleep 1000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signal.sh 9 23277 Sending SIGKILL signal $ sleep 1000 Killed
Reportez-vous également à notre précédent article kill - 4 méthodes pour tuer un processus.
Exemple de cas bash. 2. Correspondance de modèle dans un fichier
Cet exemple imprime le nombre de lignes, le nombre de mots et supprime les lignes qui correspondent au modèle donné.
$ cat fileop.sh #!/bin/bash # Check 3 arguments are given # if [ $# -lt 3 ] then echo "Usage : $0 option pattern filename" exit fi # Check the given file is exist # if [ ! -f $3 ] then echo "Filename given \"$3\" doesn't exist" exit fi case "$1" in # Count number of lines matches -i) echo "Number of lines matches with the pattern $2 :" grep -c -i $2 $3 ;; # Count number of words matches -c) echo "Number of words matches with the pattern $2 :" grep -o -i $2 $3 | wc -l ;; # print all the matched lines -p) echo "Lines matches with the pattern $2 :" grep -i $2 $3 ;; # Delete all the lines matches with the pattern -d) echo "After deleting the lines matches with the pattern $2 :" sed -n "/$2/!p" $3 ;; *) echo "Invalid option" ;; esac
L'exécution du script ci-dessus est illustrée ci-dessous.
$ cat text Vim is a text editor released by Bram Moolenaar in 1991 for the Amiga computer. The name "Vim" is an acronym for "Vi IMproved" because Vim was created as an extended version of the vi editor, with many additional features designed to be helpful in editing program source code. Although Vim was originally released for the Amiga, Vim has since been developed to be cross-platform, supporting many other platforms. It is the most popular editor amongst Linux Journal readers.
Sortie de regex de cas bash. Après suppression des lignes correspond au pattern Vim :
$ ./fileop.sh -d Vim text It is the most popular editor amongst Linux Journal readers.
Reportez-vous également à notre article précédent sur Bash ~ expansaion et { } expansion.
Exemple de cas bash 3. Rechercher le type de fichier à partir de l'extension
Cet exemple imprime le type d'un fichier (texte, Csource, etc.) en fonction de l'extension du nom de fichier.
$ cat filetype.sh #!/bin/bash for filename in $(ls) do # Take extension available in a filename ext=${filename##*\.} case "$ext" in c) echo "$filename : C source file" ;; o) echo "$filename : Object file" ;; sh) echo "$filename : Shell script" ;; txt) echo "$filename : Text file" ;; *) echo " $filename : Not processed" ;; esac done $ ./filetype.sh a.c : C source file b.c : C source file c1.txt : Text file fileop.sh : Shell script obj.o : Object file text : Not processed t.o : Object file
Exemple de cas bash 4. Inviter l'utilisateur avec Oui ou Non
Dans la plupart des installations de logiciels, lors de l'accord de licence, il demandera oui ou non à l'utilisateur. L'extrait de code suivant est l'un des moyens d'obtenir l'entrée oui ou non de l'utilisateur.
$ cat yorno.sh #!/bin/bash echo -n "Do you agree with this? [yes or no]: " read yno case $yno in [yY] | [yY][Ee][Ss] ) echo "Agreed" ;; [nN] | [n|N][O|o] ) echo "Not agreed, you can't proceed the installation"; exit 1 ;; *) echo "Invalid input" ;; esac $ ./yorno.sh Do you agree with this? [yes or no]: YES Agreed
S'il existe plusieurs modèles séparés par des barres verticales, l'expression peut correspondre à n'importe lequel d'entre eux afin que les instructions associées soient exécutées. Les modèles sont vérifiés dans l'ordre jusqu'à ce qu'une correspondance soit trouvée; si aucun n'est trouvé, rien ne se passe.
Reportez-vous également à notre article précédent sur les 15 exemples de tableaux bash.
Exemple de cas bash 5. Script de démarrage
Les scripts de démarrage du répertoire /etc/init.d utilisent l'instruction case pour démarrer et arrêter l'application.
Vous pouvez utiliser n'importe quel type de modèles, mais il est toujours recommandé d'utiliser l'instruction case lorsque vous testez des valeurs de primitives. (c'est-à-dire des entiers ou des caractères).
$ cat startpcapp #!/bin/bash case "$1" in 'start') echo "Starting application" /usr/bin/startpc ;; 'stop') echo "Stopping application" /usr/bin/stoppc ;; 'restart') echo "Usage: $0 [start|stop]" ;; esac $ ./startpcapp start Starting application /usr/bin/startpc started
Lecture recommandée
Bash 101 Hacks, par Ramesh Natarajan . Je passe la plupart de mon temps sur l'environnement Linux. Donc, naturellement, je suis un grand fan de la ligne de commande Bash et des scripts shell. Il y a 15 ans, lorsque je travaillais sur différentes versions de *nix, j'écrivais beaucoup de code sur le shell C et le shell Korn. Des années plus tard, lorsque j'ai commencé à travailler sur Linux en tant qu'administrateur système, j'ai pratiquement automatisé toutes les tâches possibles à l'aide de scripts shell Bash. Sur la base de mon expérience avec Bash, j'ai écrit le livre électronique Bash 101 Hacks qui contient 101 exemples pratiques sur la ligne de commande Bash et les scripts shell. Si vous songez à maîtriser Bash, rendez-vous service et lisez ce livre, qui vous aidera à prendre le contrôle de votre ligne de commande Bash et de vos scripts shell.