Instructions CASE

Introduction au scripting Bash

Alex Scriven

Data Scientist

Pourquoi des instructions CASE ?

Les instructions CASE peuvent être plus efficaces que IF quand vous avez 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_filename où filename est le nom d'origine
Introduction au scripting 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
  • Compliqué et répétitif, non ?
Introduction au scripting Bash

Construire une instruction CASE

  • Commencez par choisir la variable ou la chaîne à tester
    • Vous pouvez appeler un shell dans le shell ici !
  • Ajoutez autant d'associations motif / action que nécessaire.
    • Vous pouvez utiliser des regex pour PATTERN, comme Air* pour « commence par Air » ou *hat* pour « contient hat ».
  • Séparez le motif et le code à exécuter 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 au scripting 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 au scripting 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 au scripting Bash

Passons à la pratique !

Introduction au scripting Bash

Preparing Video For Download...