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 :

Problème de guillemet et d'antislash


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de MythOnirie
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2012
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2012
    Messages : 376
    Par défaut Problème de guillemet et d'antislash
    Bonjour à tous. (oui, de nuit comme de jour, moi je dis bonjour)

    J'essaie actuellement de réaliser un script shell de renommage automatique de fichier. Je n'ai pas de problème concernant le renommage, mais concernant le premier test pour savoir si je dois traiter ou non le fichier.

    Les conditions pour que le fichier soit à tester sont :
    - Il doit commencer par le chiffre 1 puis par deux autres chiffres,
    - Ensuite vient une chaine de caractère pouvant contenir tout type de symboles dont des espaces, des points, des apostrophes et quelques caractères spéciaux,
    - Après un dernier espace reviennent entre parenthèses une chaine de caractère aux mêmes propriétés,
    - Enfin il y a le format du fichier (ici .txt pour les essais).

    Voici la structure de mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #! /bin/sh
     
    for i in *
    do
       if [ "$(echo $i | grep '^1[0-9][0-9][a-zA-Z\ \.\']*([a-zA-Z\ \.]*).txt$')" ]; then
          Traitement...
       fi
    done
    exit 0
    Le problème semble venir lors du \' car lorsque je le retire le script fonctionne sans problème.
    L'erreur qui apparait est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./essai: 5: ./essai: Syntax error: "(" unexpected (expecting ")")
    Si je comprends bien, il considère que la chaine s'arrête après le \' au lieu de continuer. Pourtant je l'ai bien backslashé...

    Quelqu'un peut-il me venir en aide ?

    D'avance merci.
    MythOnirie.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    Bonjour,

    place tout le motif contenant l'apostrophe entre guillemets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #! /bin/sh
     
    for i in *
    do
       if echo $i | grep -q "^1[0-9][0-9][a-zA-Z\ \.']*([a-zA-Z\ \.]*).txt\$"
       then
          Traitement...
       fi
    done
    le test est inutile.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre émérite Avatar de MythOnirie
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2012
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2012
    Messages : 376
    Par défaut
    Merci pour ton aide, ça fonctionne ainsi.

    Pourquoi dis tu quele test est inutile ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    ce n'est pas le test, c'est la commande test ([), qui est superflue : elle contraint à passer par une substitution de commandes, qui exécute les commandes dans un sous-shell (donc un processus supplémentaire, et donc une consommation ressources système supplémentaire),
    alors que le code de retour d'une commande, ou d'un pipe, suffit à if pour distinguer un succès ou un échec.

    une structure conditionnelle initiée par le mot-clé if n'est pas obligatoire pour des conditions simples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "bla" | grep -q 'a' && echo "ok" || echo "ko"
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre émérite Avatar de MythOnirie
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2012
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2012
    Messages : 376
    Par défaut
    D'accord.
    Merci pour cet éclaircissement. Bonne journée à toi.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par MythOnirie Voir le message
    Si je comprends bien, il considère que la chaine s'arrête après le \' au lieu de continuer. Pourtant je l'ai bien backslashé...
    Juste pour que tu comprennes d'où vient ton erreur.
    Dans une chaîne délimitée par des guillemets (double quotes), on peut backslasher certains caractères (dont le guillemet).
    Dans une chaîne délimitée par des apostrophes (simple quote), on ne peut RIEN backslasher: la chaîne finit à la 2ème apostrophe et le backslash précédent est juste interprété comme un caractère backslash.
    Du coup, quand on veut une chaîne qui contient des apostrophes, on utilise préférentiellement le guillemet comme séparateur.

  7. #7
    Membre émérite Avatar de MythOnirie
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Juin 2012
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juin 2012
    Messages : 376
    Par défaut
    Merci de cette précision Jack-ft.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL-Server] Problèmes de guillemets et quotes dans un INSERT
    Par gregb34 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/05/2006, 10h40
  2. Problème de guillemets
    Par odoobe dans le forum Langage
    Réponses: 1
    Dernier message: 20/04/2006, 09h28
  3. Problème de guillemet
    Par benazerty dans le forum Access
    Réponses: 4
    Dernier message: 14/04/2006, 14h27
  4. problème de guillemet sous postgresql (requete php)
    Par toome dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 17/08/2005, 11h44
  5. problème de guillemets dans une formule shell
    Par dim_italia dans le forum VBA Access
    Réponses: 7
    Dernier message: 18/08/2003, 13h46

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