Petit script shell exécution bizarre

gerard -  
 gerard -
Bonjour,

imaginez 4 fichiers vides f1 f2 f3 f4 et le script shell suivant:
for i in 1 2
do
var='./alea.sh'
if [ -z f$var ]
then
echo $1 > f$var
fi
done


le script alea.sh choisi un nombre aléatoire entre 1 et 4 et je tape ça dans mon shell:

./script.sh toto & ./script.sh titi &, donc 2 scripts en parallèle. Quelqu'un saurait me dire pourquoi rien ne s'écrit dans aucun fichier alors que je vérifie bien au départ qu'ils sont tous vides?

merci

9 réponses

  1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    essai en mettant "set +C" au début de ton script. Si ça ne fonctionne pas, c'est que ton if est mal écrit (rajoute un echo pour être sur que tu passes dedans).
    0
  2. gerard
     
    je ne vois pas ta réponse snipeur...bon je crois qu'il y a eu un bug je voyais une réponse de ta part mais apparemment non
    0
    1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      ba si. :
      essai en mettant "set +C" au début de ton script. Si ça ne fonctionne pas, c'est que ton if est mal écrit (rajoute un echo pour être sur que tu passes dedans).
      0
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    echo $1 > f${var}
    0
  4. gerard
     
    je ne vois aucune erreur dans mon if snipeur donc...et je ne comprends pas pq je ne passerai pas dans le if :-)

    zipe: merci mais ça ne change pas grand chose, c'est sympa de m'aider mais es tu certain de faire du sh car tes réponses parfois me paraissent étranges comparées aux réponses de ceux qui connaissent le langage ( prends le pas mal ).
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Bon on va procéder par élimination...

      Quel système ?
      Quelle distrib ?
      Quel shell ?
      0
    2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      Je pense que zipe se débrouille très bien. Il me semble qu'il m'a déjà aider une fois ou deux.
      Bref, tu n'as pas répondu, as tu essayé en mettant "set +C" ?
      Le echo, c'est pour être sur, des fois, on ne voi pas les erreurs, mais elle y sont bien.
      je pense que :
      echo $1 >> f${var}
      correspondrait mieux à ton problème.
      0
    3. gerard
       
      j'utilise une virtualbox avec ubuntu et un shell bash, oui snipeur j'ai essayé en mettant set +C mais sans succès, je n'ai pas le droit de mettre echo >> car un fichier ne peut contenir qu'un terme et aucun processus ne doit écraser le terme d'un autre...
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Lances ton script en mode débogage, autrement dit rajoutes "set -xv" après le shebang, et affiches-nous le résultat.
    0
  7. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    hum...
    http://unixhelp.ed.ac.uk/CGI/man-cgi?test
    ton problème viens bien du if...
    -z STRING
    the length of STRING is zero

    Essai :
    if [ -z $(cat f$var) ]
    0
  8. gerard
     
    for i in 1 2 
    do 
    var='./alea.sh' 
    if [ -z f$var ] 
    then 
    echo $1 > f$var 
    fi 
    done 
    + for i in 1 2 
    
    for i in 1 2 
    do 
    var='./alea.sh' 
    if [ -z f$var ] 
    then 
    echo $1 > f$var 
    fi 
    done 
    + for i in 1 2 
    ./alea.sh 
    ++ ./alea.sh 
    ./alea.sh 
    ++ ./alea.sh 
    + var=3 
    + '[' -z f3 ']' 
    + for i in 1 2 
    + var=4 
    + '[' -z f4 ']' 
    + for i in 1 2 
    ./alea.sh 
    ++ ./alea.sh 
    ./alea.sh 
    ++ ./alea.sh 
    + var=2 
    + '[' -z f2 ']' 
    + var=4 
    + '[' -z f4 ']' 
    


    voila pour zipe, mais pour snipeur c'est pas possible que la chaine vaut 0 car comme tu le vois j'ai bien mes f2 f3...dans l'exécution au dessus.
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      A part que "-z" renvoie vrai si la longueur de la chaine vaut 0 (zéro), ce qui n'est pas le cas ;-(

      [  ! -z f${var} ]
      0
    2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      tu comprends vite, mais faut expliquer longtemps...
      ton script dit :
      si la chaine de caractère est vide, alors mettre le premier argument dans le fichier de la chaine caractère.
      J'espère qu'en plus tu apprécies le non sens du truc.
      En plus, comme tu le dit, il n'est pas possible que ta chaine soit nulle (d'où en plus le désinteret total de faire un test sur un résultat que tu connais).
      Pour finir c'est le fichier qui est vide, pas la chaine !
      On aurait gagner du temps si comme je te l'avais dit tu avais mis un echo. Tu te serais alors apperçut que tu ne rentrai pas dans la boucle.
      Ce que prouve d'ailleurs ton debug !
      0
  9. gerard
     
    attends zipe le -z sert bien à tester si un fichier est vide?
    Car j'avais testé avec ! -z et tout marchait bien mais le ! -z teste: si le fichier n'est pas vide alors on écrit dedans, non? Comme à la base ils sont tous vides le ! -z est censé ne pas marché, bizarre...
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Non le "-z" teste la longueur d'une chaine, pas la taille d'un fichier ;-(
      0
    2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      ouf !
      ça fait 3-4 messages que je le dit. Je me suis même donner la peine de mettre un bout du man ET la solution.
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Pour tester la taille d'un fichier c'est "-s" :

        -s file
                    True if file exists and has a size greater than zero.

      Mais là aussi il faut faire gaffe à comment on exploite le résultat ;-))
      0
    4. gerard
       
      bon merci ça ira je pense pouvoir finaliser le truc tout seul, juste une question :

      imaginez un lockfile toto.verrou juste avant le var=... et un rm -f toto.verrou juste après le fi, ça nous assure bien qu'un processus n'écrasera pas la valeur d'un autre mais en faisant un set -x j'ai 2 lockfile toto.verrou, c'est bizarre car une fois qu' un verrou est crée l'autre processus ne peut l'ouvrir tant que le rm -f sur le verrou n'a pas été exécuté...
      0
  10. gerard
     
    non j'avoue que je comprends plus rien dans mon livre est est marqué que le -z sert à tester si un fichier est vide, alors mon livre dit n'importe quoi..

    donc comment je fais moi pour tester si un fichier est vide ou non...
    0
    1. gerard
       
      .
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      man bash, y'a que ça de vrai ;-)
      0
    3. gerard
       
      je sais mais comment donc tester si un fichier est vide c'est du délire j'ai utilisé le -z 50 fois et tout a tjs marché donc je nage en pleine folie!!
      0
    4. gerard
       
      je lis mais je lis aussi dans mon bouquin que si j'ai -z toto alors ça teste le contenu de toto, donc voilà et le -s je n'ai jamais vu donc pas le droit...
      0