Perte de valeur d'une variable dans un script KSH

Top Page

Reply to this message
Author: marc.terrier
Date:  
To: guilde
Subject: Perte de valeur d'une variable dans un script KSH
Bonjour à tous,

Hier, j'ai été amené, dans le cadre de mon travail, à essayer de trouver pourquoi un certain script KSH ne se comportait pas comme on aurait voulu. Au final, j'ai réussi à localiser le problème, et à le contourner, mais pas à *expliquer* le pourquoi du comment.

Le soir, chez moi, j'ai même pris 5 mn pour essayer de reproduire le problème sur une machine perso, mais sans y parvenir, parce que chez moi, le comportement obtenu était bien celui auquel je m'attendais. Alors si l'un ou l'une d'entre vous voit une erreur grossière, ci-dessous, qui pourrait expliquer le mystère, je suis preneur...

Je ne reproduis ci-dessous que la partie de script qui pose problème. Je précise que je ne suis pas l'auteur initial de ce script. En particulier, je ne comprends pas :-) pourquoi la personne qui a programmé ça, à l'origine, fait une *boucle* pour lire la seule et unique ligne du fichier de configuration, alors que quelques lignes plus haut (non reproduites ici), le script vérifie que ce fichier de configuration ne comporte qu'une et une seule ligne, et s'arrête si ce n'est pas le cas... Hum !

01    VARIABLE="tata"
02    echo "DEBUG1> \${VARIABLE}='${VARIABLE}'"
03  
04    cat ${REP_SOURCE}/FichierDeConfiguration.txt | while read line ; do
05      VARIABLE=$line
06      echo "DEBUG2> \${VARIABLE}='${VARIABLE}'"
07      if [ $? -ne 0 ] ; then
08        msglog $LOG_FILE 3 3001 "*ERREUR* lors de la récupération du contenu de la ligne $line"
09        msglog $LOG_FILE 3 3001 "*ERREUR* dans le fichier FichierDeConfiguration.txt"
10        f_arretInstall
11      fi
12    done
13
14    #VARIABLE=`cat ${REP_SOURCE}/FichierDeConfiguration.txt`
15    echo "DEBUG3> \${VARIABLE}='${VARIABLE}'"
16
17    case "${VARIABLE}" in
18      ...
19    esac


À l'origine, le script ne comportait que les lignes qui sont ici numérotées de 04 à 05, et 07 à 12, et le case/esac qui commence ligne 17. C'est moi qui ai rajouté les lignes 01, 02, 06, 14 et 15. La ligne 14 résoud le problème en annulant l'effet de la boucle qui précède, mais ça n'explique pas pourquoi la variable $VARIABLE perd sa valeur à la sortie de la boucle while ... do ... done.

Voici les traces d'exécution au boulot, sur une machine RHEL 5.5 (quand la ligne 14 est en commentaires), avec un fichier de configuration qui ne contient qu'un Y majuscule :

DEBUG1> ${VARIABLE}='tata'
DEBUG2> ${VARIABLE}='Y'
DEBUG3> ${VARIABLE}=''            la variable perd sa valeur reçue précédemment, comme si elle avait une portée limitée au while do done ???


Et voici les traces d'exécution chez moi, sous Ubuntu 10.04 LTS (quand la ligne 14 est en commentaires) :

DEBUG1> ${VARIABLE}='tata'
DEBUG2> ${VARIABLE}='Y'
DEBUG3> ${VARIABLE}='Y'

On a constaté le problème en remarquant que, dans le case/esac, on passait toujours dans le cas par défaut *). Or les lignes 06 et 15, rajoutées par mes soins, montrent que $VARIABLE perd sa valeur une fois qu'on sort de la boucle while.

La ligne 14 a été rajoutée après coup pour contourner le problème, sans le dièse de commentaire, bien sûr. Cela règle le problème, mais ne l'explique pas. Une idée, quelqu'un ?

Merci d'avance.