connectiva penguin bsd logo

Les scripts bash

1_Notre premier script

2_Les variables

3_Les commandes composées    (; | & || && $() {} ``)

4_Ecriture à l'écran / lecture au clavier    (echo read)

5_Le passage de paramètres

6_Les structures conditionnelles    (if then else while until)

7_Les autres structures    (for in do case select)

8_Les fonctions

9_Pour aller plus loin


7_Les autres structures

structure POUR chaque élément de la liste FAIRE ...

Cette structure nous permet de faire une action pour chaque élément d'une liste. La liste peut être donnée directement, ou être le résultat d'une commande.

Syntaxe :

for element in liste_des_elements; do actions; done

On met un point-virgule après la liste des éléments et après le groupe d'actions.

Exemple 1, où on tape la liste manuellement :

#!/bin/bash
for mois in janvier fevrier mars avril; do
echo $mois;
done

Le résultat est :

./test.sh
janvier
fevrier
mars
avril

Exemple 2, où la liste est le résultat d'une commande. Au lieu de faire un exemple bête comme j'en ai l'habitude... Si, si... On va faire un script très pratique, qui permet de renomer des fichiers par lot. On appelle le script avec deux paramètres : le premier est l'extention actuelle des fichiers, le second est l'extention qu'on veut donner. Et comme maintenant vous êtes très forts, on va même vérifier que le nombre de paramètres est bon. C'est plus prudent avec les étourdis !

#!/bin/bash
if ! [ $# -eq 2 ]; then
  echo "Le nombre de parametres doit etre de 2 (ancienne-extension nouvelle-extention) !"
else
  ext1=$1
  ext2=$2
  for file in `ls *.$ext1`; do
    mv $file ${file%.$ext1}.$ext2;
  done
fi

Voilà le résultat :

$ ls
a.txt b.txt c.txt renome.sh
$ ./renome.sh
Le nombre de parametres doit etre de 2 (ancienne-extension nouvelle-extention) !
$ ./renome.sh txt tmp
$ ls
a.tmp b.tmp c.tmp renome.sh

Et voilà le travail ! Tous nos fichiers .txt ont été renomés en .tmp. Et nous avons été avertis quand le nombre de paramètres n'était pas bon.

structure DANS chacun des cas suivants FAIRE ...

Pour ce type de structure, on utilise la commande case. Cette commande est équivalente à une série de if ... elif ... elif ... elif ... else ... fi, mais ç apparait de façon beaucoup plus claire et lisible.

Syntaxe :

case valeur in
  cas_1) action_1;;
  cas_2) action_2;;
  cas_3) action_3;;
  *) action_sinon;;
esac

Pour chaque possibilité, on a une action associée. Si aucun des cas n'est rencontré, c'est l'action par défaut (correspondant à "*)") qui est exécutée. Chaque action ou suite d'actions se termine par un double point-virgule. La structure se termine par "esac" ("case" écrit à l'envers).

La commande select

Syntaxe :

select valeur in liste_de_valeurs; do actions; done

La commande select affiche un menu qui vous propose le choix parmis la liste définie. Chaque ligne est numérotée en partant de 1. Select affiche une phrase qui vous demande d'entrer votre choix. Cette phrase est contenu dans la variable PS3 qu'il faudra initialiser avant (par défaut, elle contient "#?"). Une fois que vous avez validé votre réponse, elle est mémorisée dans la variable REPLY.

Select repose indéfiniment la même question, jusqu'à ce qu'on quitte le script avec les touches ctrl-c. Pour éviter ça, on utilise la commande "break" qui permet de sortir de la structure pour passer à la suite du script. Il est fortement conseillé d'utiliser select en combinaison avec case. Ainsi, on peut facilement orienter le déroulement du script en fonction de la valeur choisie.

Comme tout ça n'est pas vraiment simple dit comme ça, on va faire un exemple pour montrer que finalement ça n'est pas si complexe que ça en a l'air. Au contraire, on peut faire très facilement un menu.

#!/bin/bash
PS3="> selectionnez un plat : " # definie l'invite du menu
echo " -- menu du jour -- " # affiche un titre
select choix in cassoulet pizza "salade du chef" "quitter (q|Q)"; do
case $REPLY in
  1) echo "Voici votre $choix."
     echo "Desirez-vous autre chose ?";;
  2) echo "Une pizza ? Excellent choix !"
     echo "Desirez-vous autre chose ?";;
  3) echo "Et une $choix, une !"
     echo "Desirez-vous autre chose ?";;
  4|Q*|q*) echo "Au revoir" # on quitte en appuyant sur 4, ou en tapant un mot commancant par Q ou q
     break;;
  *) echo "Je n'ai pas compris votre commande. Veuillez repeter svp.";;
  esac
done

Voilà ce que ça donne à l'écran :

$ ./test.sh
-- menu du jour --
1) cassoulet
2) pizza
3) salade du chef
4) quitter (q|Q)
> selectionnez un plat : azerty
Je n'ai pas compris votre commande. Veuillez repeter svp.
1) cassoulet
2) pizza
3) salade du chef
4) quitter (q|Q)
> selectionnez un plat : 2
Une pizza ? Excellent choix !
Desirez-vous autre chose ?
1) cassoulet
2) pizza
3) salade du chef
4) quitter (q|Q)
> selectionnez un plat : q
Au revoir

Et voilà comment qu'on est trop forts !

<< page précédente
6_Les structures conditionnelles
page suivante >>
8_Les fonctions

Valid XHTML 1.1

logo firefox logo ubuntu logo debian logo mandriva logo gimp