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 20/01/2011, 21h12   #1
Membre à l'essai
 
Inscription : mars 2004
Messages : 122
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 122
Points : 20
Points : 20
Par défaut question sur la commande test

Bonjour,

J'aimerais avoir un éclaircissement sur la commande test avec le parametre e.

Mon code :

Code :
1
2
3
4
5
6
7
 
 
if /usr/bin/test -e "$DATA_EXTRACT/rating_by_postal_code/*.csv"; then
        echo "    Move completed successfully"  
else
      echo "    ERROR "  
  fi
si je fais un ls de ce qu'il y a entre "", j'ai un résultat de plusieurs fichiers .csv.

Par contre lorque j'execute ce code, je passe toujours par le else (echo error) et ce malgré que j'ai des fichiers dans le répertoire mentionné.

Le but est seulement de vérifier l'existence d'au moins un fichier... peut-etre il y a une meilleure facon de procéder et votre aide là dessus est apprécié.

merci
juin29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 22h06   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 069
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 069
Points : 4 145
Points : 4 145
bonjour,

les expansions ne sont pas réalisées entre guillemets.
dans ton cas, j'utiliserais un tableau, et vérifierais qu'il existe au moins un élément :
Code :
1
2
3
shopt -s nullglob
array=( $DATA_EXTRACT/rating_by_postal_code/*.csv )
if test -n ${array[0]}; then echo "ok"; else echo "KO"; fi
ou bien, que le nombre d'éléments du tableau est supérieur à zéro :
Code :
1
2
3
shopt -s nullglob
array=( $DATA_EXTRACT/rating_by_postal_code/*.csv )
if ((${#array[@]})); then echo "ok"; else echo "KO"; fi
NB: /usr/bin/test n'est pas une commande intégrée de l'interpréteur de commande; alors que test, elle, l'est.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/01/2011, 09h56   #3
Membre habitué
 
Inscription : février 2008
Messages : 159
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 159
Points : 125
Points : 125
Bonjour,

Autre façon de faire (je n'ai jamais utilisé la commande test):

Code :
1
2
3
4
5
6
7
 
if [ -e $DATA_EXTRACT/rating_by_postal_code/*.csv ]
then
        echo "OK"
else
        echo "KO"
fi
Attention cependant aux espaces ! Cette façon de faire est très sensible à la syntaxe. Il faut un espace avant ET après chaque chose (le crochet, le '-e' etc).

Cordialement,
Elverion
__________________
Vous n'arrivez pas à faire ce que vous voulez avec Linux?
Read The Fine Manual !==>The Linux Documentation Project
Elverion est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/01/2011, 10h19   #4
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 069
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 069
Points : 4 145
Points : 4 145
bonjour Elverion,

ça ne marchera pas si :
- le nom de fichier contient un ou des espaces
- le répertoire contient plusieurs fichiers
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2011, 19h50   #5
Membre à l'essai
 
Inscription : mars 2004
Messages : 122
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 122
Points : 20
Points : 20
ok je vais regarder les 2 options...

La solution du -e me semblait vraiment plus facile mais bon je vais les essayer et vous revenir.
juin29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 20h01   #6
Membre à l'essai
 
Inscription : mars 2004
Messages : 122
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 122
Points : 20
Points : 20
Bonjour,

La piste de Elverion fonctionne... voici le code :

Code :
1
2
3
4
5
6
7
 
 if [ -e $DATA_EXTRACT/rating_by_postal_code/*.csv ]; then 
        echo "    Move completed successfully"
 
  else
      echo "    ERROR : The file $DATA_EXTRACT/rating_by_postal_code/*.csv doesn't exist"
  fi
donc le if fonctionne de cette facon. Mais avec ta mise en garde N_BaH je ne sais plus quoi penser :

Il y a plusieurs fichiers dans mon répertoire par contre il n'y a pas d'espace dans les noms...


merci
juin29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 20h30   #7
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Je reste persuadé qu'un simple "ls *.csv" sur le répertoire et un test sur le code retour serait le plus approprié, d'autant plus que ton test actuel je ne suis pas sûr qu'il marche aussi bien que tu le dis, la preuve :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$ ls -1
abc.txt
aoiu.txt
baytre.txt
cabiu.txt
cuypo.txt
iuyabcoiu.txt
oiuapoi.txt
ubiuy.txt

$ if [ -e *.txt ];then echo ok;else echo Nok;fi
-bash: [: trop d'arguments
Nok

$ set -xv;if [ -e *.txt ];then echo ok;else echo Nok;fi;set -
+ '[' -e abc.txt aoiu.txt baytre.txt cabiu.txt cuypo.txt iuyabcoiu.txt oiuapoi.txt ubiuy.txt ']'
-bash: [: trop d'arguments
+ echo Nok
Nok
+ set -

$ ls *.txt
abc.txt  aoiu.txt  baytre.txt  cabiu.txt  cuypo.txt  iuyabcoiu.txt  oiuapoi.txt  ubiuy.txt

$ echo $?
0

$ ls *.png
ls: ne peut accéder *.png: Aucun fichier ou dossier de ce type

$ echo $?
1

$
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 02h05   #8
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 069
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 069
Points : 4 145
Points : 4 145
voilà, voilà. Hormis, si on peux ne pas utiliser une commande externe, on s'en passe; par économie de temps et de ressources.

Il faut donc privilégier l'usage de test, [, ou [[ dans les scripts, pour ... faire des tests
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2011, 14h31   #9
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
A noter, que les doubles crochets acceptent les noms de fichiers avec espaces (mais qu'ils ne marchent qu'en bash).
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 13h26   #10
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Je me permets d'apporter mon point de vue qui n'engage que moi.

Certes, chercher à optimiser les temps de traitements etc est une bonne chose, mais pas si cela se fait au détriment de la lecture !

Or entre
Code :
1
2
array=( $DATA_EXTRACT/rating_by_postal_code/*.csv )
if ((${#array[@]})); then echo "ok"; else echo "KO"; fi
et
Code :
1
2
if ls "$DATA_EXTRACT/rating_by_postal_code/"*.csv >/dev/null 2>&1;
then echo "ok"; else echo "KO"; fi
Je trouve la second formule un peu plus facile à comprendre non ?

Et je doute que cela impacte beaucoup sur les perfs.
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 14h41   #11
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 978
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 978
Points : 5 993
Points : 5 993
Bonjour;

@ Alek-C : Les deux codes sont suffisamment lisibles si on les indentes correctement.
On ne va pas proscrire les expressions bash (au profit de commandes externes en plus ) pour le fait que ça parait moins lisible (ou tout simplement parce qu'on ne les connait pas).

Il en est de même pour les regex, on ne va pas les proscrire et faire tout un tas de traitement pour compenser, sous prétexte qu'elles ne nous paraissent pas lisibles.

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 14h44   #12
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 069
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 069
Points : 4 145
Points : 4 145
Citation:
Envoyé par Alek-C
Et je doute que cela impacte beaucoup sur les perfs.
si ce n'est que ça, peut-être pas...
mais, une commande externe plus une commande externe...plus une autre...et, là, ça devient sensible;

donc, j'évite d'utiliser la première
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h23.


 
 
 
 
Partenaires

Hébergement Web