Petit script shell exécution bizarre

Fermé
gerard - 3 mars 2011 à 12:36
 gerard - 3 mars 2011 à 16:02
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

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 mars 2011 à 12:52
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
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 mars 2011 à 13:56
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
3 mars 2011 à 14:00
Salut,

echo $1 > f${var}
0
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
3 mars 2011 à 14:49
Bon on va procéder par élimination...

Quel système ?
Quelle distrib ?
Quel shell ?
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 mars 2011 à 14:53
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
3 mars 2011 à 15:01
Lances ton script en mode débogage, autrement dit rajoutes "set -xv" après le shebang, et affiches-nous le résultat.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 mars 2011 à 15:02
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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
3 mars 2011 à 15:13
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
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 mars 2011 à 15:17
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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
3 mars 2011 à 15:21
Non le "-z" teste la longueur d'une chaine, pas la taille d'un fichier ;-(
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
3 mars 2011 à 15:24
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
3 mars 2011 à 15:27
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
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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
3 mars 2011 à 15:46
man bash, y'a que ça de vrai ;-)
0
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
3 mars 2011 à 15:50
0
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