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

Linux Discussion :

bash: if, test et *


Sujet :

Linux

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 16
    Points : 12
    Points
    12
    Par défaut bash: if, test et *
    Bonsoir,

    Je cherche à faire un truc tout simple en bash mais pourtant je butte depuis des heure sans trouver de solution.

    Je veux programmer une boucle qui teste si des fichiers ayant la même racine existent:
    ----------
    code
    ----------
    if [[ -f /tmp/fichier.* ]]
    then echo "Il existe déjà une/des copie/s de ce fichier"
    exit -1
    fi
    ----------

    un ls /tmp/fichier.* marche:
    fichier.5678 fichier.6782 fichier.9854

    un test sur le nom entier des fichiers également:
    [[ -f /tmp/fichier.6782 ]] ; echo $?
    0

    Mais rien pour ce que je recherche. Une idée?

    Merci d'avance

    Julien

  2. #2
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Points : 646
    Points
    646
    Par défaut
    Salut !
    Dans ton post tu as déjà la réponse, le wildcard '*' n'existe pas pour 'test', il faut que tu imbrique ton test dans une boucle for/while

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    je comprends pas trop ton but

    si tu mets dans ton script simplement "ls fichier.*" il va t afficher tous les fichiers existants commencant par "fichier."

    faire une boucle et passer en revue tous les fichiers commençant par fichier n apportera rien de plus

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 730
    Points : 31 053
    Points
    31 053
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cyberserker Voir le message
    un ls /tmp/fichier.* marche:
    fichier.5678 fichier.6782 fichier.9854
    C'est parce que, entre ce que tu tapes et ce que reçoit la commande ls, il y a une phase d'analyse. Et durant cette phase, l'interpréteur shell remplace le * par ce qu'il trouve dans ton environnement qui y correspond, à savoir les fichiers.
    En fait, la commande "ls" reçoit textuellement la chaine suivante:
    fichier.5678 fichier.6782 fichier.9854
    chaine construite par l'interpréteur shell à partir du caractère *.

    Or, comme cela a été dit, l'interpréteur ne fait pas ce travail pour les instructions internes shell (c.a.d. la commande "test").

    Citation Envoyé par cyberserker Voir le message
    Je veux programmer une boucle qui teste si des fichiers ayant la même racine existent:
    ls fichier.* |wc -l => te donne le nombre de fichiers correspondants => te suffit de vérifier si ce nombre est plus grand que ce que t'attends...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 34
    Points : 41
    Points
    41
    Par défaut
    Pour être plus précis, la complétion des noms de fichiers ne se fait pas avec [[ mais elle se fait avec [ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ touch fichier.65 && ls
    fichier.65
    $ [ -f fichier.* ] && echo OK
    OK
    Mais dans ce cas ça n'apporte pas grand chose puisqu'il y aurait une erreur dès le second nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ touch fichier.55 && ls
    fichier.55  fichier.65
    $ [ -f fichier.* ] && echo OK
    bash: [: fichier.55 : opérateur binaire attendu

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Je ferais simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ls /tmp/fichier.*
    then
        ...
    fi

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 191
    Points
    191
    Par défaut
    Bonjour

    J'ai le meme besoin que Cyberserker (et à mon avis on doit être loins d'être les seuls !)

    J'ai testé les 2 solutions apportées dans ce fil, ca donne ca :

    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
     
    FLOGARR_EXPED_DATE="sgsmitfbpr22_18062009*"
    NB=`ls ${FLOGARR_EXPED_DATE} | wc -l`
    if [ $NB != 0 ]
    then
       echo "trouve"
    else
       echo "pas trouve"
    fi
     
    if ls ${FLOGARR_EXPED_DATE}
    then
       echo "trouve"
    else
       echo "pas trouve"
    fi
    dans les 2 cas, on a une sortie un peu genante : la liste des fichiers trouvées est affichée en sortie à l'écran, ou bien erreur de type "no such file or directory" s'il n'en trouve pas. Comment éviter cela tout en gardant bien sur les autres sorties du reste de mon script ?

    PS : je trouve cela qd meme dommage que -f, -e etc ne permettent de tester l'existence d'un seul fichier et pas plusieurs fichiers avec wildcard, c'est qqchose dont on a qd meme souvent besoin.

    L.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Loko Voir le message
    Bonjour
    fi[/code]dans les 2 cas, on a une sortie un peu genante : la liste des fichiers trouvées est affichée en sortie à l'écran, ou bien erreur de type "no such file or directory" s'il n'en trouve pas. Comment éviter cela tout en gardant bien sur les autres sorties du reste de mon script ?
    L.
    Salut,

    Ce genre de message d'erreur est envoyé sur l'erreur standard (2).

    Si tu ne souhaites pas afficher ces messages, il suffit de les rediriger vers /dev/null.

    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [user@server ~]# if ls test ; then  echo "found"; else echo "not found"; fi
    ls: test: Aucun fichier ou répertoire de ce type
    not found
    
    [user@server ~]# if ls test 2> /dev/null ; then  echo "found"; else echo "not found"; fi
    not found

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 730
    Points : 31 053
    Points
    31 053
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Loko Voir le message
    PS : je trouve cela qd meme dommage que -f, -e etc ne permettent de tester l'existence d'un seul fichier et pas plusieurs fichiers avec wildcard,
    Alors ce n'est pas "-f" et "-e" qui testent l'existence d'un fichier mais la commande "test". Et si son comportement ne correspond pas à ton besoin, c'est parce que cette commande est 1) incluse dans le shell et 2) très basique afin que son appel soit le plus rapide possible (n'oublie pas que le shell est interprété)

    Citation Envoyé par Loko Voir le message
    c'est qqchose dont on a qd meme souvent besoin.
    Parle pour toi. Moi je ne me souviens pas avoir eu besoin de ce genre d'évaluation.
    Maintenant rien ne t'empêche de créer ton propre "testMultiple.sh" qui fait une boucle d'évaluation de chaque fichier qu'il reçoit en paramètre et renvoie en final un booléen vrai/faux. Ensuite ben t'appelles "testMultiple.sh" dès que t'en as besoin...

Discussions similaires

  1. Erreur de test if en bash
    Par tortue_22 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 07/05/2010, 09h46
  2. Test en bash
    Par FotoXe33 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 30/10/2009, 17h16
  3. Réponses: 8
    Dernier message: 01/08/2007, 15h38
  4. Test d'expression avec bash
    Par Fluxy dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 28/03/2007, 07h56
  5. Bash : Test d'une chaine
    Par kimlee dans le forum Administration système
    Réponses: 2
    Dernier message: 26/01/2007, 13h31

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