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 21/10/2011, 10h55   #1
Membre du Club
 
Inscription : juillet 2002
Messages : 156
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 156
Points : 40
Points : 40
Envoyer un message via MSN à foxrol
Par défaut Problème Script SHell

Bonjour

J'ai un problème avec un petit script. En effet mon script se connecte à un répertoire, recherche un certain nombre de fichier et compte les lignes dans les fichiers trouvés.
Code sh :
1
2
3
4
5
6
7
8
9
10
11
12
 
n=`find /home/sasalim/TKA -type f -name "*.log_20111007" |wc -l`
i=1
while [ $n -ge $i ]
do
  #echo "i="$i
  #echo `find -type f |ls -al`
  echo "Nombre de lignes du fichier fich$i.log_2011100 : "  `cat fich$i.log_20111007 |wc -l`
        nb$i=`cat fich$i.log_20111007 |wc -l`
  echo "nb$1=" $nb$i
  i=`expr $i + 1`
done

Le résultat retourné est le suivant:

Code sh :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
Nombre de lignes du fichier fich1.log_2011100 :  2616
use4.sh[36]: nb1=:  not found.
nb= 1
Nombre de lignes du fichier fich2.log_2011100 :  1829
use4.sh[36]: nb2=:  not found.
nb= 2
Nombre de lignes du fichier fich3.log_2011100 :  4442
use4.sh[36]: nb3=:  not found.
nb= 3
Nombre de lignes du fichier fich4.log_2011100 :  4442
use4.sh[36]: nb4=:  not found.
nb= 4
Donc il a trouvé 4 fichiers remplissant la condition fich1.log_20111007, fich2.log_20111007, fich3.log_20111007 et fich4.log_20111007 et pour chacun des fichiers il a calculé le nombre de ligne sauf pour le fichier fich4.log_20111007. Alors pourquoi n'arrive t'il pas à interpréter nb$i=`cat fich$i.log_20111007 |wc -l` pour m'afficher les bonnes valeurs de nb$i?

Merci d'avance.
foxrol est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/10/2011, 12h07   #2
Membre habitué
 
Avatar de Levi59
 
Homme
Étudiant
Inscription : août 2011
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 46
Points : 126
Points : 126
Citation:
Envoyé par foxrol Voir le message
Bonjour

J'ai un problème avec un petit script. En effet mon script se connecte à un répertoire, recherche un certain nombre de fichier et compte les lignes dans les fichiers trouvés.
Code :
1
2
3
4
5
6
7
8
9
10
11
n=`find /home/sasalim/TKA -type f -name "*.log_20111007" |wc -l`
i=1 
while [ $n -ge $i ] 
do   
    #echo "i="$i   
    #echo `find -type f |ls -al`   
    echo "Nombre de lignes du fichier fich$i.log_2011100 : "  `cat fich$i.log_20111007 |wc -l`         
    nb$i=`cat fich$i.log_20111007 |wc -l`   
    echo "nb$1=" $nb$i 
      i=`expr $i + 1` 
done
Pour définir de nouvelles variables à partir d'autres variables à la volée dans un script, il faut utiliser "eval" :
Code :
eval Var$i=$(ta commande)
__________________
Carpe Diem
Levi59 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 21/10/2011, 14h26   #3
Membre Expert
 
Homme
Ingénieur développement logiciels
Inscription : octobre 2008
Messages : 1 375
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : octobre 2008
Messages : 1 375
Points : 2 034
Points : 2 034
Remarque bien que dans ce cas tu n'as pas besoin de créer une variable "nb1", "nb2"... différente à chaque tour de boucle. Tu peux te contenter d'avoir une seule variable "nb" et la réutiliser à chaque tour.
matafan est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/10/2011, 15h33   #4
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Citation:
Envoyé par Levi59
Pour définir de nouvelles variables à partir d'autres variables à la volée dans un script, il faut utiliser "eval" :
Pour définir des variables, il faut utiliser declare.

cependant, la remarque de matafan est très juste.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/10/2011, 15h43   #5
Membre du Club
 
Inscription : juillet 2002
Messages : 156
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 156
Points : 40
Points : 40
Envoyer un message via MSN à foxrol
Citation:
Envoyé par matafan Voir le message
Remarque bien que dans ce cas tu n'as pas besoin de créer une variable "nb1", "nb2"... différente à chaque tour de boucle. Tu peux te contenter d'avoir une seule variable "nb" et la réutiliser à chaque tour.
donc si j'ai bien suivi il faut faire quelque chose du genre:

Code sh :
1
2
3
4
5
6
7
8
9
10
11
12
 
n=`find /home/sasalim/TKA -type f -name "*.log_20111007" |wc -l`
i=1 
while [ $n -ge $i ] 
do   
    #echo "i="$i   
    #echo `find -type f |ls -al`   
    echo "Nombre de lignes du fichier fich$i.log_2011100 : "  `cat fich$i.log_20111007 |wc -l`         
    nb=`cat fich$i.log_20111007 |wc -l`   
    echo "nb=" nb 
      i=`expr $i + 1` 
done

C'est bien ça?
foxrol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 15h49   #6
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
j'ai oublié de dire : cat n'est pas indispensable :expr non plus : le shell peut faire l'évaluation arithmétique.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/10/2011, 17h02   #7
Membre habitué
 
Avatar de Levi59
 
Homme
Étudiant
Inscription : août 2011
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 46
Points : 126
Points : 126
Citation:
Envoyé par N_BaH Voir le message
Pour définir des variables, il faut utiliser declare.
J'avais faux? Pourtant ça marche chez moi...

Code :
1
2
3
4
5
6
$: a=1
$: b$a=2
bash: b1=2 : commande introuvable
$: eval b$a=2
$: echo $b1
2
__________________
Carpe Diem
Levi59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 17h13   #8
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
oui, ça marche, mais ce n'est pas pour autant que c'est bien.
eval est une commande dangereuse : elle transforme en commande tout ce qui lui passe entre les pattes.

=>
eval c'est mal !
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 21/10/2011, 19h02   #9
Membre habitué
 
Avatar de Levi59
 
Homme
Étudiant
Inscription : août 2011
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 46
Points : 126
Points : 126
Ok! Merci d'avoir précisé. Je ferais attention dorénavant.
__________________
Carpe Diem
Levi59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h33.


 
 
 
 
Partenaires

Hébergement Web