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] ne pas substituer le caractère "*"


Sujet :

Linux

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 49
    Points : 53
    Points
    53
    Par défaut [bash] ne pas substituer le caractère "*"
    bonjour,

    je ne m'en sors pas avec un tout petit problème

    je voudrais que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ VAR="a b *" ; echo $VAR
    affiche :
    et non pas :
    (file1 file2 étant le contenu du répertoire courant)

    je n'ai pas trouvé de solution pour que bash ne remplace pas "*" par la liste des fichiers du répertoire.

    j'ai bien essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ VAR="a b \*" ; echo $VAR
    mais cela m'affiche :
    et non pas :
    Je n'ai peut être pas bien parcouru le 'man bash', mais je n'ai pas trouvé de solution. Pourtant je suis certain qu'il doit y avoir une réponse élégante à mon soucis

    merci pour vos suggestions

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 386
    Points
    19 386
    Par défaut
    ici entre autres.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 49
    Points : 53
    Points
    53
    Par défaut
    ok
    echo "*" affiche bien "*"
    mais cela semble différent lorsque l'on passe par des variables

    d'où mon problème

  4. #4
    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 : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 386
    Points
    19 386
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  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 : 45
    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
    Ah ben non, ça ça ne change rien

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 49
    Points : 53
    Points
    53
    Par défaut
    en fait c'est peut être un peu plus compliqué que je ne croyais

    ce que je veux faire :
    * définir une variable contenant un ensemble de fichier à exclure d'un diff (ici VAR). Chaque fichier sera passé en ligne de commande préfixé par '-x", genre "-x *.c~ -x *.bak"
    * et je lance "diff" en lui passant la valeur de la variable

    ce qui correspond à peu près à :

    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
     
    #!/bin/sh
    # test.sh
     
    VAR="config.h *.c~ *.sh"
    ret=""
     
    for v in $VAR
    do
            ret+=" -x $v";
            echo "ret=$ret"
    done
     
    echo "je devrais avoir:"
    echo "diff -ur -x config.h -x *.c~ -x *.sh old new"
    echo "mais j'obtiens:"
    echo "diff -ur $ret old new"
    mais dans mon exemple "*.sh" est remplacer par "test.sh" (c'est le nom du script de test)

    exemple de sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ ./test.sh
    je devrais avoir:
    diff -ur -x config.h -x *.c~ -x *.sh old new
    mais j'obtiens:
    diff -ur  -x config.h -x *.c~ -x test.sh old new
    si comme N_BaH le suggère je remplace
    for v in $VAR
    par
    for v in "$VAR"

    j'ai bien le "*" mais le variable n'est plus "splittée" par le "for" et je me retrouve avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ ./test.sh
    je devrais avoir:
    diff -ur -x config.h -x *.c~ -x *.sh old new
    mais j'obtiens:
    diff -ur  -x config.h *.c~ *.sh old new
    c'est à dire :
    -x config.h *.c~ *.sh
    au lieu de
    -x config.h -x *.c~ -x *.sh"

    bref, je tombe sur un autre problème ... grrr

    En fin de compte, je me demande si il ne faudrait pas changer de méthode ?

  8. #8
    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 : 45
    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
    Effectivement dans ce cas c'est plus délicat. Je pense que le plus simple et le plus sûr serait de désactiver temporairement le "pathname expansion" avec set -f (puis le ré-activer si besoin avec set +f).

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 386
    Points
    19 386
    Par défaut
    En fin de compte, je me demande si il ne faudrait pas changer de méthode ?
    sûrement !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 49
    Points : 53
    Points
    53
    Par défaut
    je pourrais (et je vais surement) changer la façon de procéder mais elle me semblait assez élégante (je le dis car le vrai soft en question, cygport, n'est pas de moi)

    Et bash (ou plutôt ses utilisateurs) m'avait toujours habitué à trouver une solution simple et efficace.

    ... mais il me reste le set -f / set +f

    bye

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pfxxx Voir le message
    bonjour,

    je ne m'en sors pas avec un tout petit problème

    je voudrais que :
    $ VAR="a b *" ; echo $VAR
    affiche :
    a b *
    et non pas :
    a b file1 file2
    (file1 file2 étant le contenu du répertoire courant)

    je n'ai pas trouvé de solution pour que bash ne remplace pas "*" par la liste des fichiers du répertoire.
    Je n'ai peut être pas bien parcouru le 'man bash', mais je n'ai pas trouvé de solution. Pourtant je suis certain qu'il doit y avoir une réponse élégante à mon soucis

    merci pour vos suggestions
    $ VAR="a b *" ; echo "$VAR"
    Le "file 1 file2" ne provient pas de l'affectation en ligne 1 mais de l'affichage en ligne 2 !!!

    Tu trouveras mon tuto shell ici et plus de détails sur la gestion des méta caractères en page 27...

    Citation Envoyé par pfxxx Voir le message
    Et bash (ou plutôt ses utilisateurs) m'avait toujours habitué à trouver une solution simple et efficace.
    Oui... mais il faut connaitre ses principes
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 49
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    $ VAR="a b *" ; echo "$VAR"
    Le "file 1 file2" ne provient pas de l'affectation en ligne 1 mais de l'affichage en ligne 2 !!!
    Tu trouveras mon tuto shell ici et plus de détails sur la gestion des méta caractères en page 27...
    Certes mais cela ne résout pas mon petit problème.
    Mon premier exemple était trop trivial.
    Le deuxième (cf. post 03/09/2010 14h48) pose plus concrètement mon problème et "quoter" la variable ne résout pas mon problème ... mais en introduit un nouveau.

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pfxxx Voir le message
    en fait c'est peut être un peu plus compliqué que je ne croyais

    ce que je veux faire :
    * définir une variable contenant un ensemble de fichier à exclure d'un diff (ici VAR). Chaque fichier sera passé en ligne de commande préfixé par '-x", genre "-x *.c~ -x *.bak"
    Bon, c'est là qu'il faut savoir précisément ce que tu veux qu'il y ait dans ta variable "VAR"

    1) soit tu veux qu'il y ait les fichiers présents au moment où t'appelles le programme
    Exemple
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/sh
    for arg
    do
    	VAR="$VAR $arg"
    done
    echo "VAR='$VAR'"
    Et tu appelles ce programme de la façon suivante
    Le shell transformera l'étoile au moment de l'appel, et stockera dans VAR les noms des fichiers présents

    2) soit tu veux qu'il y ait "*" et que ce soit le programme qui fasse l'expansion
    Exemple
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/sh
    for arg
    do
            VAR="$VAR $arg"
    done
    touch "azert.c"          # Le fichier est créé après l'appel du script
    echo "VAR='$(eval echo $VAR)'"

    Et tu appelles ce programme de la façon suivante
    (avec les guillemets pour que l'étoile ne soit pas expandée lors de l'appel)

    Nota: on peut aussi appeler ./prog.sh \*.c ou ./prog.sh '*.c'

    Là, le shell stockera dans VAR le caractère "*.c". L'expansion ne se fera qu'au moment du traitement (d'ailleurs tu verras apparaitre "azert.c" alors que ce fichier n'existait pas au moment de l'appel... mais faut pour cela utiliser "eval" qui transforme une string en ordre shell)

    Citation Envoyé par pfxxx Voir le message
    En fin de compte, je me demande si il ne faudrait pas changer de méthode ?
    Non, pas besoin...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    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 : 45
    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
    Ca je crois qu'il a compris, mais si tu relis le post #7 tu vois que son problème est plus compliqué. En gros il veux garder les étoiles dans $VAR, mais il a plusieurs éléments dans $VAR et il veut ajouter un -x devant chaque élément.

  15. #15
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    Bonjour,

    Tu peux aussi utiliser des caractères dont tu es sûr que tu n'as pas.
    Par exemple avec [ et ]:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    VAR="1 2 *"
    for i in $(echo "$VAR" | sed -e s'/[^\ ]*/[[&]]/'g | sed -e s'/\[\[\]\]//'g) ; do
        echo "$i" | sed -e s'/^\[\[\([^\]]*\)\]\]/\1/' 
    done
    Et dans ce cas tu as bien la réponse que tu attends
    Tu n'as plus qu'à ajouter ton -x :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    VAR="1 2 *"
    for i in $(echo "$VAR" | sed -e s'/[^\ ]*/[[&]]/'g | sed -e s'/\[\[\]\]//'g) ; do
        echo "$i" | sed -e s'/^\[\[\([^\]]*\)\]\]/-x\1/' 
    done

    Lilian.

  16. #16
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par matafan Voir le message
    Ca je crois qu'il a compris, mais si tu relis le post #7 tu vois que son problème est plus compliqué. En gros il veux garder les étoiles dans $VAR, mais il a plusieurs éléments dans $VAR et il veut ajouter un -x devant chaque élément.
    Mouais.

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/sh
    for arg
    do
            VAR="$VAR $arg"
    done
    echo "Variable de base: '$VAR'"
    echo "Variable expandée (ci-dessous): "
    touch "azert.c"
    echo $VAR |sed -e "s/ / -x /g" -e "s/^/-x /"
    rm -f "azert.c"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    moi@debian:~$ ll *.c
    -rw-r--r-- 1 moi moi  541 aoû 21 23:18 a.c
    -rw-r--r-- 1 moi moi 1053 aoû 19 00:02 b.c (il n'y a pas de fichier "azert.c")
    -rw-r--r-- 1 moi moi 1173 aoû 19 00:33 c.c
    -rw-r--r-- 1 moi moi 1221 aoû 19 01:38 d.c
    -rw-r--r-- 1 moi moi  313 aoû 10 01:52 essai.c
    -rw-r--r-- 1 moi moi 1618 aoû 28 14:28 fils.c
    -rw-r--r-- 1 moi moi  328 aoû  8 17:19 select.c
    moi@debian:~$ ./essai2.sh '*.c'
    Variable de base: ' *.c'
    Variable expandée (ci-dessous): 
    -x a.c -x azert.c -x b.c -x c.c -x d.c -x essai.c -x fils.c -x select.c
    moi@debian:~$
    PS: j'ai failli faire une remarque sur que la solution de lilian_h car on ne peut être jamais certain qu'il n'y aura pas les caractères "[ ]" mais en fait, on peut faire la même remarque pour la mienne dans le cas où on a des noms de fichiers avec espace...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  17. #17
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    Effectivement, on ne peut pas etre certain qu'il n'y ai pas de [ ou ], mais qd même, dans la solution que je propose, la probabilité pour que les noms de fichiers contiennent des doubles [[ et ]] est relativement faible devant les espaces.

    Maintenant, des espaces dans les noms de fichiers, moi perso, ca me choque un peu... mais ca arrive...

    Quid du set -f ? Je ne comprends pas pourquoi il n'est pas utilisé ?
    De toute facon il l'embarque dans un script, lorsqu'il va l'appelé il s'executera dans un shell fille ... donc tant qu'il ne le source pas il n'aura jamais aucun soucis.

    Lilian.

  18. #18
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    pfxxx,

    Comment comptes-tu intégrer ton script ? Quel est ton objectif final ?
    Cette variable VAR, qui contient la liste des pattern de fichiers à exclure, comment comptes-tu la passer ?

    Lilian.

  19. #19
    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 : 45
    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 me répète, mais à mon avis le plus sûr c'est de désactiver le pathname expansion avec set -f et de laisser le shell découper la chaine en morceaux. Le reste c'est du bricolage.

  20. #20
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    matafan > complètement d'accord. Je ne comprends pas pourquoi il n'est pas utilisé

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Importation de données caractères avec quote
    Par caro92 dans le forum SAS Base
    Réponses: 3
    Dernier message: 25/11/2015, 09h59
  2. Réponses: 3
    Dernier message: 08/06/2007, 14h16
  3. ne peut pas simplement "aXSLProc.Process(aCursor);"
    Par didier.cabale dans le forum XMLRAD
    Réponses: 16
    Dernier message: 08/03/2006, 12h25

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