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 07/03/2011, 18h36   #1
Membre éprouvé
 
Avatar de ben.IT
 
Homme Benoît
Inscription : janvier 2009
Messages : 392
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 24
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : janvier 2009
Messages : 392
Points : 438
Points : 438
Par défaut if conditions multiples et tester existence fichier générique

Bonsoir à tous,
J'utilise dans un script shell un outil qui va générer des fichiers de sorties différents selon la taille du fichier "f" passé en entrée.
Avant de poursuivre le script, je souhaite vérifier que les fichiers générés soient corrects.
2 cas à vérifier :

-premier cas, l'outil doit avoir générer les fichiers suivants :
-second cas, l'outil doit avoir générer les fichiers suivants :
Code :
f.00.ext1  f.00.ext2  f.00.ext3 f.virt
J'ai donc écris une conditionnelle :
Code :
1
2
3
4
5
6
7
if [[ ( -s f.ext1 && -s f.ext2 && -s f.ext3 ) || ( -s f.00.ext1 && -s f.00.ext2 && -s f.00.ext3 && -s f.virt )]]
then 
	echo ok
else 
	echo "ko" 
	exit 1
fi
Je souhaiterai maintenant rendre le test sur la seconde partie de mon test générique en utilisant des plages de valeurs telles que [0-9] ou [[:digit:]].
En effet, l'outil peut générer des fichiers comme :
Code :
f.01.ext1  f.01.ext2  f.01.ext3 f.02.ext1  f.02.ext2  f.02.ext3 etc ...
J'ai donc essayé :
Code :
if [[ ( -s f.ext1 && -s f.ext2 && -s f.ext3 ) || ( -s f.[0-9][0-9].ext1 && -s f.[0-9][0-9].00.ext2 && -s f.[0-9][0-9].00.ext3 && -s f.virt )]]
Mais cela ne fonctionne pas, c'est à dire que -s f.[0-9][0-9].00.ext2 n'est pas interprété comme je le souhaiterai et ne reconnait pas le fichier f.00.ext1 par exemple.

Comment faire ?

Je ne suis pas familier avec cette écriture à base de double brackets [[ ]], si quelqu'un peut m'aider sur ce point également, son aide est la bienvenue .

merci d'avance.
ben
__________________
Meet the free software gang
ben.IT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 20h17   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Bonjour,

les tests sur les fichiers, testent un fichier à la fois; il n'est pas possible d'utiliser le Développement des chemins, et/ou les Motifs génériques.

éventuellement, pour alimenter un tableau, puis (ou directement) une boucle for pour tester chaque fichier
...
?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 07/03/2011, 21h01   #3
Membre éprouvé
 
Avatar de ben.IT
 
Homme Benoît
Inscription : janvier 2009
Messages : 392
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 24
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : janvier 2009
Messages : 392
Points : 438
Points : 438
Salut N_BaH,
Effectivement,
je pense que ce message d'erreur est en rapport avec ce que tu dis :

Code :
1
2
3
4
5
6
7
8
9
 
[benoit@benoit tmp]$ ls
f.00.ext1  f.00.ext2  f.00.ext3  f.01.ext1  f.01.ext2  f.01.ext3  f.ext1  f.ext2  f.ext3  f.virt  scriptTest.sh
 
[benoit@benoit tmp]$ if [ ls f.[0-9][0-9].ext1 ] ; then  echo ok ; fi
bash: [: f.00.ext1: binary operator expected
 
[benoit@benoit tmp]$ if [ ls f.??.ext1 ] ; then  echo ok ; fi
bash: [: f.00.ext1: binary operator expected
__________________
Meet the free software gang
ben.IT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 21h12   #4
Membre éprouvé
 
Avatar de ben.IT
 
Homme Benoît
Inscription : janvier 2009
Messages : 392
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 24
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : janvier 2009
Messages : 392
Points : 438
Points : 438
j'ai pu résoudre mon problème en séparant les 2 cas : je fais un premier test correspondant au premier cas.
Code :
1
2
 
if [[ ( -s $1.ext1 && -s $1.ext2 && -s $1.ext3LO ) ]]
Puis dans le else, je fais un ls sur :
Code :
1
2
 
ls $1.[0-9][0-9].ext1 $1.[0-9][0-9].ext2 $1.[0-9][0-9].ext3 $1.virt
et analyse le code de retour rendu par $?.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
  1 #!/bin/bash
  2 echo '########start########'
  3 
  4 if [[ ( -s $1.ext1 && -s $1.ext2 && -s $1.ext3LO ) ]]
  5 then
  6         echo 'format right'
  7 else
  8         #pattern nom.00.ext
  9         ls $1.[0-9][0-9].ext1 $1.[0-9][0-9].ext2 $1.[0-9][0-9].ext3 $1.virt 1> /dev/null 2>&1
 10         if [ $? -ne 0 ]
 11         then
 12                 echo 'format problem'
 13         else
 14                 echo 'seconde cas ok'
 15         fi
 16 fi
 17 
 18 
 19 echo '#########end#######'

A propos des doubles brackets [[ ]]d'après mon bouquin, il s'agit d'une syntaxe différente des simple brackets [ ] où les opérateurs -a et -o sont respectivement remplacés par && et ||. Avec les doubles, on peut utiliser les parenthèses sans les échapper pour regrouper les expressions logiques.
Est ce qu'il y a d'autres différences ou est ce juste une question de pure syntaxe ?


bonne soirée,
ben
__________________
Meet the free software gang
ben.IT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/03/2011, 22h01   #5
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
il y a plus, notamment la possibilité d'utiliser des regexes; lis attentivement la section du man concernant cette commande composée, et celle qui y sont liées.

pour ma part, je procéderais ainsi :
Code :
1
2
3
4
5
6
7
8
$ touch f.ext.{1,2,3}
$ shopt -s extglob nullglob
$ array=( f?(.[0-9][0-9]).ext.[0-9] )
$ case $array in
> f.[0-9][0-9].ext.[0-9]) echo "cas 2";;
> f.ext.[0-9]) echo "cas 1";;
> esac
cas 1
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 08/03/2011, 16h47   #6
Rédacteur
 
Inscription : mars 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 298
Points : 1 450
Points : 1 450
Citation:
Est ce qu'il y a d'autres différences ou est ce juste une question de pure syntaxe ?
C'est une questions de syntaxes effectivement mais aussi et surtout "d'évolution", de changement d'époque et donc amélioration du shell, le [[ ainsi que le (( d'ailleurs, sont des évolutions les plus récente du shell "ISO" (1999 ?) (entre guillemet car le "standard" est loin d'être tout a fait standard) , Ksh, Bash au moins accepte cette syntaxe.
__________________
Marc
Slackware for ever ......
BASH - KSH ( http://marcg.developpez.com/ksh/ )
MarcG est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h10.


 
 
 
 
Partenaires

Hébergement Web