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 :

unexpected operator [:


Sujet :

Shell et commandes GNU

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 27
    Par défaut unexpected operator [:
    Bonjour à tous,

    J'ai une erreur, ou plutôt un avertissement lors de l'execution de cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ $( echo "$mot_concatene" | cut -c 1 ) = *[[:upper:]]* ]
    Pouvez vous me dire pourquoi ça n'a pas l'air d'aimer la balise upper ?

    Merci.

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

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

    l'opérateur = effectue des comparaisons lexicales : il compare des mots, ou des phrases entre guillemets.
    le test POSIX [, qui est un alias de le commande interne test, ne permet pas l'emploi de Motifs génériques (cf. man bash); il faut utiliser [[.

    pourquoi des astérisques autour de [[:upper:]], alors qu'il n'y a qu'un seul caractère testé ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    [HS]
    @N_BaH: Pour prendre le premier caractère d'une variable, est-il plus efficace de faire $( echo "$mot_concatene" | cut -c 1 ) ou bien "${mot_concatene%${mot_concatene#?}}" (qui est beaucoup plus lisible!) ?
    [/HS]

  4. #4
    Expert confirmé

    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
    Par défaut
    Salut,

    Citation Envoyé par jack-ft Voir le message
    [HS]
    @N_BaH: Pour prendre le premier caractère d'une variable, est-il plus efficace de faire $( echo "$mot_concatene" | cut -c 1 ) ou bien "${mot_concatene%${mot_concatene#?}}" (qui est beaucoup plus lisible!) ?
    [/HS]
    Perso je dirai : ${mot_concatene::1}

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 27
    Par défaut
    Tout d'abord, merci de me répondre

    En mettant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [[ $( echo "$mot_concatene" | cut -c 1 ) = [[:upper:]] ]]
    j'obtiens le message suivant lors de l'execution : [[: not found

    Vous avez raison pour les *, je les ai enlevé.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Perso je dirai : ${mot_concatene::1}
    Je sais bien qu'on est dans un forum linux/gnu, mais j'ai des contraintes de portabilité... et cette syntaxe n'est pas complètement universelle. En particulier, sous AIX/ksh88:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo ${toto::1}      
    ksh: ${toto::1}: 0403-011 The specified substitution is not valid for this command.
    En tout cas, c'est une excellente initiative que de mentionner cette alternative pour linux/bash

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par R3MIX Voir le message
    j'obtiens le message suivant lors de l'execution : [[: not found
    Quel shell utilises-tu?
    Quelle version?

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 27
    Par défaut
    Voici ce que j'utilise :

    GNU bash, version 4.2.37(1)-release (i686-pc-linux-gnu)

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Bonjour,

    Bizarre, chez moi, cela fonctionne...

    [HS]
    sinon si c'est uniquemment le premier caractère qui interresse, une autre façon de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if $(echo "App" | grep -q '^[[:upper:]]') ; then echo OK; fi
    [/HS]

  10. #10
    Expert confirmé

    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ cat foo.sh 
    #! /bin/bash
     
    read -p "Entrez un nom de ville : " nom
     
    if [[ ${nom::1}  =~ [[:upper:]] ]]; then
    	echo "OK. ${nom} commence bien par la lettre capitale \"${nom::1}\"." 
    	else 
    	echo "Désolé, mais ${nom} ne commence pas par une lettre capitale \"${nom::1}\"."
    	echo "Bonne orthographe : \"${nom^}\"."
    fi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ ./foo.sh 
    Entrez un nom de ville : Toulouse
    OK. Toulouse commence bien par la lettre capitale "T".
     
    $ ./foo.sh 
    Entrez un nom de ville : paris
    Désolé, mais paris ne commence pas par une lettre capitale "p".
    Bonne orthographe : "Paris".

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 27
    Par défaut
    Le problème vient du fait que j'utilise :

    et pas

    Je vais quand même changer les tests puisque vous dites que c'est plus optimisé.

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Plutôt que de couper le 1er caractère, on peut aussi tester tout le mot (comme proposé par disedorgue):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # Solution ksh approximative (ne matche pas les majuscules accentuées À É and co):
    if [[ "$mot_concatene" = [A-Z]* ]]; then echo ok ; fi
    # Solution bash (et certains ksh):
    if [[ "$mot_concatene" = [[:upper:]]* ]]; then echo ok ; fi
    # Solution bash (d'après zipe31):
    if [[ "$mot_concatene" =~ [[:upper:]]* ]]; then echo ok ; fi
    # Solution ksh/bash de disedorgue:
    if $(echo "$mot_concatene" | grep -q '^[[:upper:]]') ; then echo ok; fi

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Attention, regarde bien, je ne test que le premier caractère :
    '^[[:upper:]]'

  14. #14
    Expert confirmé

    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
    Par défaut
    Citation Envoyé par R3MIX Voir le message
    Le problème vient du fait que j'utilise : #!/bin/sh et pas #! /bin/bash
    Ça sent le dash à plein nez ça

    Que te renvoie la commande suivante readlink -f /bin/sh ?

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 27
    Par défaut
    /bin/dash

    C'est gênant ?

  16. #16
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    [RECREATION]
    Et une autre pour s'amuser (dans la première, on check le 1er caractère, dans la deuxieme on check le deuxieme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ echo $TITI
    Tata
    $ expr substr "$TITI" 1 1  : '[[:upper:]]'>/dev/null && echo ok || echo nook
    ok
    $ expr substr "$TITI" 2 1  : '[[:upper:]]'>/dev/null && echo ok || echo nook
    nook
    Pour les non connaisseurs, ici, comme on peut le voir, il y a un if,then,else implicite
    [/RECREATION]

  17. #17
    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
    Par défaut
    Bonsoir.

    Citation Envoyé par R3MIX Voir le message
    /bin/dash

    C'est gênant ?
    Disons que dash est assez light et ne propose pas autant de souplesse que bash ou ksh pour ce genre de choses (regexp dans les tests...). Bon tu dois toujours pouvoir bricoler avec grep.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if grep ... >/dev/null 2>&1 # ou avec l'option -q
    Mais bon si tu disposes de bash (et c'est le cas sur les Debian based), je te conseil d'utiliser bash si cela t'es possible afin de profiter de la syntaxe des doubles crochets et de l'opérateur =~ qui font des merveilles (ça évites d'utiliser entre autres des commandes externes).

    Cordialement,
    Idriss

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    Citation Envoyé par jack-ft
    Pour prendre le premier caractère d'une variable, est-il plus efficace de faire $( echo "$mot_concatene" | cut -c 1 ) ou bien "${mot_concatene%${mot_concatene#?}}" (qui est beaucoup plus lisible!) ?
    àma, moins il y a de commandes externes, plus un script est performant.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Unexpected token operator, expected punc
    Par mapmip dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 07/07/2014, 13h52
  2. Erreur unexpected end of file
    Par snoop dans le forum Linux
    Réponses: 6
    Dernier message: 22/03/2004, 10h37
  3. [JSP] thread ? Message d'avancement des operations en cours
    Par buffyann dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 18/12/2003, 11h39
  4. operation sur des alias
    Par 74160 dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/11/2003, 18h19
  5. Réponses: 8
    Dernier message: 21/11/2003, 18h38

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