Instructions CASE

Introduction à la programmation Bash

Alex Scriven

Data Scientist

Pourquoi des instructions CASE ?

Les instructions case peuvent être plus efficaces que IF quand il y a plusieurs conditions ou des conditions complexes.

Supposons que vous vouliez tester les conditions et actions suivantes :

  • Si un fichier contient sydney, le déplacer vers le répertoire /sydney
  • Si un fichier contient melbourne ou brisbane, le supprimer
  • Si un fichier contient canberra, le renommer en IMPORTANT_filenamefilename est le nom d'origine
Introduction à la programmation Bash

Un IF complexe

Vous pourriez écrire plusieurs IF comme ceci :

  • Ce code appelle grep sur le premier argument ARGV pour la condition.
if grep -q 'sydney' $1; then
    mv $1 sydney/
fi
if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi
if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi
  • C'est complexe et répétitif, non ?
Introduction à la programmation Bash

Construire une instruction CASE

  • Commencez par choisir la variable ou la chaîne à comparer
    • Vous pouvez appeler un shell dans le shell ici !
  • Ajoutez autant d'associations motif‑action que nécessaire.
    • Vous pouvez utiliser des expressions rationnelles pour PATTERN, p. ex. Air* pour « commence par Air » ou *hat* pour « contient hat ».
  • Séparez le motif et la commande par une parenthèse fermante et terminez les commandes par deux points‑virgules

Format de base d'une instruction CASE :

case 'STRINGVAR' in

PATTERN1) COMMAND1;; PATTERN2) COMMAND2;;
Introduction à la programmation Bash

Construire une instruction CASE

 

  • *) DEFAULT COMMAND;;

    • Il est courant (mais pas obligatoire) de terminer par une commande par défaut exécutée si aucun motif ne correspond.
  • esac Enfin, le mot de fin est « esac »

    • C'est « case » à l'envers !

Format de base d'une instruction CASE :

case 'STRING' in
  PATTERN1)
  COMMAND1;;
  PATTERN2)
  COMMAND2;;

*) DEFAULT COMMAND;;
esac
Introduction à la programmation Bash

De IF à CASE

Notre ancien IF :

if grep -q 'sydney' $1; then
    mv $1 sydney/
fi

if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi

if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi

Notre nouveau CASE :

case $(cat $1) in

*sydney*) mv $1 sydney/ ;; *melbourne*|*brisbane*) rm $1 ;; *canberra*) mv $1 "IMPORTANT_$1" ;;
*) echo "No cities found" ;; esac
Introduction à la programmation Bash

Passons à la pratique !

Introduction à la programmation Bash

Preparing Video For Download...