IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

question sur la commande test


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 48
    Points
    48
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre actif
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2008
    Messages
    174
    Détails du profil
    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2008
    Messages : 174
    Points : 220
    Points
    220
    Par défaut
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    bonjour Elverion,

    ça ne marchera pas si :
    - le nom de fichier contient un ou des espaces
    - le répertoire contient plusieurs fichiers

  5. #5
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 48
    Points
    48
    Par défaut
    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.

  6. #6
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 137
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    
    $

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    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

  9. #9
    Membre averti Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Points : 337
    Points
    337
    Par défaut
    A noter, que les doubles crochets acceptent les noms de fichiers avec espaces (mais qu'ils ne marchent qu'en bash).

  10. #10
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    array=( $DATA_EXTRACT/rating_by_postal_code/*.csv )
    if ((${#array[@]})); then echo "ok"; else echo "KO"; fi
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  11. #11
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 450
    Points
    19 450
    Par défaut
    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

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    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

Discussions similaires

  1. Questions sur la commande nohup
    Par cquilgars dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 31/07/2013, 15h36
  2. Les questions sur les commandes Linux
    Par codon21 dans le forum Linux
    Réponses: 6
    Dernier message: 26/03/2009, 23h18
  3. Petite question sur la commande system()
    Par johnnydepp dans le forum C
    Réponses: 19
    Dernier message: 06/05/2007, 18h00
  4. question sur la commande df
    Par Melvine dans le forum Linux
    Réponses: 5
    Dernier message: 27/12/2006, 19h06
  5. Questions sur la commande awk
    Par vbcasimir dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 17/01/2006, 11h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo