Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/09/2006, 23h04   #1
Membre habitué
 
Inscription : janvier 2005
Messages : 488
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 488
Points : 130
Points : 130
Par défaut Stocker le résultat d'une commande

Hello,
je souhaite réaliser un script bash (je débute...) qui cherche simplement l'occurence d'un mot dans certains fichiers et qui ensuite déplace ces fichiers.
Mon pb est le suivant: je souhaite stocker le résultat d'une commande dans une variable ms je ne trouve pas comment faire. Pour le moment j'ai le petit script suivant, qui ne fonctionne pas:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
#!/usr/local/bin/bash -norc
for i in `ls | grep .gen`
do
       res=`grep bact $i` # pb
 
       if test $res = bact
       then
                mv $i bact_f/
       fi
done
La variable res semble ne pas stocker le résultat... Si quelqu'un peut me mettre sur la voie pr stocker le résultat d'une commande...

Merci d'avance.
vinzzzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2006, 16h04   #2
Membre Expert
 
Avatar de 2Eurocents
 
Inscription : septembre 2004
Messages : 2 180
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : septembre 2004
Messages : 2 180
Points : 2 442
Points : 2 442
Citation:
Envoyé par vinzzzz
...
Code :
1
2
3
4
5
6
7
8
9
10
#!/usr/local/bin/bash -norc
for i in `ls | grep .gen`
do
       res=`grep bact $i` # pb
 
       if test $res = bact
       then
                mv $i bact_f/
       fi
done
La variable res semble ne pas stocker le résultat... Si quelqu'un peut me mettre sur la voie pr stocker le résultat d'une commande...
En es tu vraiment sûr ? As tu tenté un "echo $res" juste après l'affectation ?
Les back-quotes sont pourtant l'opérateur "old-school" qui permet de faire ce que tu souhaite.
La nouvelle syntaxe POSIX, à privilégier, est cependant $( ) plutôt que ``.

On devrait donc pouvoir écrire :
Code :
1
2
3
4
5
6
7
8
9
10
11
#!/usr/local/bin/bash -norc
for i in $(ls | grep .gen)
do
       res=$(grep bact $i) # pb
echo "res vaut [$res]"
 
       if test $res = bact
       then
                mv $i bact_f/
       fi
done
Par ailleurs, ton test, dans le if, ne me paraît pas forcément pertinent.
Pourquoi ne pas te baser simplement sur le code de retour du grep ? Il vaut 0 en cas de succès du grep, 1 en cas d'échec (et 2 en cas d'erreur).


Bon courage,
__________________
La FAQ Perl est par ici
: La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !
2Eurocents est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2006, 14h41   #3
Membre habitué
 
Inscription : janvier 2005
Messages : 488
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 488
Points : 130
Points : 130
Citation:
Par ailleurs, ton test, dans le if, ne me paraît pas forcément pertinent.
Pourquoi ne pas te baser simplement sur le code de retour du grep ? Il vaut 0 en cas de succès du grep, 1 en cas d'échec (et 2 en cas d'erreur).
Oui il n'est pas vraiment pertinent, même si dans l'exercice que j'ai a faire il fonctionne... Je sais pas comment tester si la commande a marché ou si la chaine est nulle.
J'ai regardé un petit peu sur internet et j'ai trouvé la structure suivante:
Code :
1
2
3
4
5
 
if [-n "$res"]  # Si la chaine est non nulle
then
	mv $i virus_file/
fi
Mais ca semble ne pas passer: le shell me renvoie "[ -n commande introuvable"...
Comment récupérer le code de retour du grep?

MErci a toi de ta réponse en tout cas
vinzzzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2006, 14h45   #4
Membre habitué
 
Inscription : janvier 2005
Messages : 488
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 488
Points : 130
Points : 130
Ok c'est bon, j'ai trouvé, dans l'exemple qu'on me donnait sur internet ils avaient oublié le mot test, et les crochets semble également être de trop.
Le test donne ceci finalement:
Code :
1
2
3
4
5
 
if test -n "$res"  # Si la chaine est non nulle
then
	mv $i virus_file/
fi
Merci a toi en tout cas. Juste, pr finir, j'ai testé si la chaine était nulle ou non, est-ce ce que tu voulais me faire faire? Si non, peut tu me dire comment récupérer le code de retour de grep?
vinzzzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2006, 15h30   #5
Membre Expert
 
Avatar de 2Eurocents
 
Inscription : septembre 2004
Messages : 2 180
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : septembre 2004
Messages : 2 180
Points : 2 442
Points : 2 442
Citation:
Envoyé par vinzzzz
Ok c'est bon, j'ai trouvé, dans l'exemple qu'on me donnait sur internet ils avaient oublié le mot test, et les crochets semble également être de trop.


test et crochets sont synonymes.
Par contre, les crochets doivent être séparés de tout autre texte par un blanc. Il faut donc écrire Et comme je l'ai dit, pourquoi ne pas se baser tout simplement sur le code de retour de grep ?
Code :
1
2
3
if grep montexte monfichier ; then
   echo "J'ai trouvé ..."
fi
Sinon, après l'exécution de chaque commande, chaque code de retour se trouve dans la variable $?

Bon courage.
__________________
La FAQ Perl est par ici
: La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !
2Eurocents est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2006, 16h28   #6
Membre habitué
 
Inscription : janvier 2005
Messages : 488
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 488
Points : 130
Points : 130
Code :
1
2
3
 
test et crochets sont synonymes.
Par contre, les crochets doivent être séparés de tout autre texte par un blanc. Il faut donc écrire
Ok je pense que j'avais pas mis les espaces...
Pr le retour du grep, je me serai basé dessus si j'avais su comment faire
Maintenant c'est le cas.

Juste pr vérifier:
Code :
1
2
3
4
 
if grep montexte monfichier ; then
   echo "J'ai trouvé ..."
fi
est donc équivalent a:
Code :
1
2
3
4
5
 
if $? -eq 1 
then
   echo "J'ai trouvé ..."
fi
vinzzzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h06.


 
 
 
 
Partenaires

Hébergement Web