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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    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
    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

  6. #6
    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é.

  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 347
    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 347
    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".

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