Structures de contrôles en bash
Transcription
Structures de contrôles en bash
Structures de contrôles en bash Les mots‐clés sont en gras, liste désigne une liste de commandes. Boucles Conditions for nom [ in mots ] ; do liste ; done if liste; then liste; [elif liste; then liste;] * while liste; do liste; done [else liste;] fi case mot in [ motif[|motif]*) liste;;]* esac Exemples : if fichier=/home/alfred/devoir.html if [ -f $fichier –a –r $fichier ] then echo "je vais vérifier ton devoir" elif [ ! –e $fichier ] then echo "ton devoir n'existe pas " else echo "ton devoir n'est pas lisible" fi case read langue case $langue in francais) echo "Bonjour" ;; anglais) echo "Hello" ;; espagnol) echo "Buenos Dias" ;; esac case $param in 0|1|2|3|4|5|6|7|8|9 ) echo "$param est un chiffre" ;; [0-9]*) echo "$param est un nombre" ;; [a-zA-Z]*) echo "$param est un mot" ;; *) echo "param non prévu" ;; esac for echo "Le script $0 a été appelé avec $# paramètres" for I in $* do if test -e $I ; # si $I est un fichier then echo "$I est un fichier" else echo "$I n'est pas un fichier" fi done while I=0 while [ $I –lt 10 ]; do I=$(($I+1)); done Exemple illustrant les structures de contrôle (if, case, while, for) #!/bin/bash # Script comptant le nombre d'utilisateur appartenant au meme groupe qu'un # utilisateur donné # test des arguments if [ $# -eq 0 ] then echo "usage : $0 nom_utilisateur" exit 1 elif [ $# -gt 2 ] then echo "arguments > 2 non pris en compte" fi # petit test intermédiaire sans importance case $USER in $1) echo "Test vous concernant";; *) echo "Test sur un autre utilisateur";; esac # demande de validation sur la suite OK=-1 while [ $OK -eq -1 ] do echo "Voulez-vous continuez ?" read response case $response in [yYoO]*) OK=1;; [nN]*) OK=0;; esac done # ; si l'instruction continue sur la ligne (d'où les 2 ';') if [ $OK -eq 0 ]; then exit 2; fi # pour récupérer exactement le nom de l'utilisateur # NOM_UT=`cut -d: -f1 | grep -n "^$1$"` -> 21:mathis # exemple de ligne : mathis:x:501:501:mathis pascal:/home/mathis:/bin/bash NUM_LIGNE=`cut -d: -f1 /etc/passwd | grep -n "^$1$" | cut -d: -f1` if [ -z $NUM_LIGNE ] then echo "information non trouvée" exit 3 fi LIGNE=`head -$NUM_LIGNE /etc/passwd | tail -1` # récupération du numéro de groupe NUM_GROUPE=`echo $LIGNE | cut -d: -f3` I=0 for VAL in `cut -d: -f3 /etc/passwd` do if [ $VAL -eq $NUM_GROUPE ] then I=`expr $I + 1` # ou I=$(($I+1)) fi done # autre possibilité : VAL=`cut -d: -f3 /etc/passwd | grep $NUM_GROUPE | wc -l` echo "Vous etes $I utilisateur(s) à appartenir au groupe de $1"