Bonjour à tous,
J'ai une erreur, ou plutôt un avertissement lors de l'execution de cette ligne :
Pouvez vous me dire pourquoi ça n'a pas l'air d'aimer la balise upper ?Code:if [ $( echo "$mot_concatene" | cut -c 1 ) = *[[:upper:]]* ]
Merci.
Version imprimable
Bonjour à tous,
J'ai une erreur, ou plutôt un avertissement lors de l'execution de cette ligne :
Pouvez vous me dire pourquoi ça n'a pas l'air d'aimer la balise upper ?Code:if [ $( echo "$mot_concatene" | cut -c 1 ) = *[[:upper:]]* ]
Merci.
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é ?
[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]
Tout d'abord, merci de me répondre :)
En mettant ceci :
j'obtiens le message suivant lors de l'execution : [[: not foundCode:if [[ $( echo "$mot_concatene" | cut -c 1 ) = [[:upper:]] ]]
Vous avez raison pour les *, je les ai enlevé.
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. :cry: En particulier, sous AIX/ksh88:
En tout cas, c'est une excellente initiative que de mentionner cette alternative pour linux/bash :ccool:Code:
1
2 $ echo ${toto::1} ksh: ${toto::1}: 0403-011 The specified substitution is not valid for this command.
Voici ce que j'utilise :
GNU bash, version 4.2.37(1)-release (i686-pc-linux-gnu)
Bonjour,
Bizarre, chez moi, cela fonctionne...
[HS]
sinon si c'est uniquemment le premier caractère qui interresse, une autre façon de faire:
[/HS]Code:if $(echo "App" | grep -q '^[[:upper:]]') ; then echo OK; fi
Code:
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:
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".
Le problème vient du fait que j'utilise :
et pasCode:#!/bin/sh
Je vais quand même changer les tests puisque vous dites que c'est plus optimisé.Code:#! /bin/bash
Plutôt que de couper le 1er caractère, on peut aussi tester tout le mot (comme proposé par disedorgue):
Code:
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
Attention, regarde bien, je ne test que le premier caractère ;):
'^[[:upper:]]'
/bin/dash
C'est gênant ?
[RECREATION]
Et une autre pour s'amuser (dans la première, on check le 1er caractère, dans la deuxieme on check le deuxieme:
Pour les non connaisseurs, ici, comme on peut le voir, il y a un if,then,else impliciteCode:
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
[/RECREATION]
Bonsoir.
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.
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).Code:if grep ... >/dev/null 2>&1 # ou avec l'option -q
Cordialement,
Idriss
àma, moins il y a de commandes externes, plus un script est performant.Citation:
Envoyé par jack-ft