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
A voir également:

9 réponses

Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
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
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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   Statut Contributeur Dernière intervention   6 430
 
Salut,

echo $1 > f${var}
0
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
Bon on va procéder par élimination...

Quel système ?
Quelle distrib ?
Quel shell ?
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
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

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

Posez votre question
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
Non le "-z" teste la longueur d'une chaine, pas la taille d'un fichier ;-(
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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   Statut Contributeur Dernière intervention   6 430
 
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
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
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
gerard
 
.
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
man bash, y'a que ça de vrai ;-)
0
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
0
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