until

Syntaxe :

until commande1
do
     commande2
     ...
done

A l'inverse de while, la commande until exécute les commandes situées entre le do et le done tant que la commande située à droite du until retourne un code faux.

Exemple :

Le script suivant boucle tant que le nombre saisi n'est pas égal à 53

$ nl boucleUntil01.sh
     1  #!/bin/bash
     2  nbr=0
     3  until ((nbr==53))
     4  do
     5          echo -e "Saisir 53 : \c"
     6          read nbr
     7  done
     8  exit 0
$ ./boucleUntil01.sh
Saisir 53 : 45
Saisir 53 : rt
Saisir 53 : fd
Saisir 53 : 53
$

Le script suivant permet, en tâche de fond, de surveiller un répertoire donné et d'informer l'utilisateur de l'arrivée d'un fichier attendu dans ce répertoire.
Pour plus de sécurité sur l'intégrité du fichier attendu, un fichier témoin devra être créé à la suite du fichier attendu puisque le principal contrôle se fera sur l'existence de ce fichier.

$ nl boucleUntil02.sh
     1    #!/bin/bash
     2    # Il doit y avoir au minimum 2 paramètres en arguments et un maximum de 3
     3    if [[ $# -lt 2 || $# -gt 3 ]]
     4    then
     5        echo "Utilisation : $0 repertoire fichier [ temoin ]"
     6        exit 1
     7    fi
     8    # Le premier argument doit être un répertoire
     9    if [[ ! -d $1 ]]
    10    then
    11        echo "$1 n'est pas un répertoire"
    12        exit 2
    13    fi
    14    # Nom du fichier témoin par défaut
    15    ficTemoin=${3:-temoin}
    16    # Exécution de la boucle en attendant l'arrivée du fichier témoin avec une pause toutes les 3 secondes
    17    until [[ -e $1/$ficTemoin ]]
    18    do
    19        sleep 3
    20    done
    21    # Vérification que le fichier attendu est bien présent
    22    if [[ ! -e $1/$2 ]]
    23    then
    24        echo "Le fichier témoin existe mais le fichier attendu est absent"
    25        exit 3
    26    fi
    27    # Sauvegarde du fichier attendu dans le HOME de l'utilisateur avec horodatage et suppression du fichier témoin
    28    date=$(date '+%Y%m%d_%H%M')
    29    newFichier=$2.$date
    30    mv $1/$2 $HOME/$newFichier
    31    rm $1/$ficTemoin
    32    # Envoi d'un mail à l'utilisateur
    33    mail $LOGNAME <<FIN
    34    Le fichier $HOME/$newFichier est bien arrivé.
    35    FIN
    36    echo "$0 : Vous avez reçu un message !!! "
    37    exit 0
$ ./boucleUntil02.sh /tmp monFichier &     # Lancement du script en arrière plan grâce à la commande &
[1] 2298
$ touch /tmp/monFichier                                   # Création du fichier attendu
$ touch /tmp/temoin                                           # Création du fichier témoin
$ ./boucleUntil02.sh : Vous avez reçu un message !!!     # Message généré par la ligne 36
 
[1]+  Done                    ./boucleUntil02.sh /tmp monFichier
$

il ne reste plus qu'à consulter sa boite mail pour lire le message envoyé par le script.

Etiquettes: