OVH Cloud OVH Cloud

shell, chaine et pattern

15 réponses
Avatar
FAb
Bonjour,

Je me demandais comment en shell on pouvait tester si une chaîne contenait un
caractère, voire un motif... Évidemment c'est facile, mais sans appel à une
commande externe ?

Sans commande externe, on peut utiliser le 'case'. Mais existe-t-il d'autres
façons de procéder ?
Genre un grigri du style $(mot/pattern/sub) ?
J'avoue que je sèche un peu en bash et que je ne suis pas une idole en zsh...

Bien cordialement et meilleurs voeux pour 2007
FAb

10 réponses

1 2
Avatar
Nicolas George
Tu fais des lignes trop longues.

FAb wrote in message :
Genre un grigri du style $(mot/pattern/sub) ?


La notation ${foo%%pattern} enlève pattern à la fin de $foo. Du coup, si
${foo%%pattern} est la chaîne vide, c'est que foo matche pattern.

Avec zsh (et peut-être d'autres), [[ $foo == pattern ]] fait ça directement.

Avatar
FAb
Nicolas George <nicolas$ writes:

Tu fais des lignes trop longues.

FAb wrote in message :
Genre un grigri du style $(mot/pattern/sub) ?


La notation ${foo%%pattern} enlève pattern à la fin de $foo. Du coup, si
${foo%%pattern} est la chaîne vide, c'est que foo matche pattern.


Bien essayé ! J'avais vu !
Mais je cherche à m'assurer du '@' dans une chaine !

Avec zsh (et peut-être d'autres), [[ $foo == pattern ]] fait ça directement.


Ok, merci.

FAb


Avatar
Nicolas George
FAb wrote in message :
Bien essayé ! J'avais vu !
Mais je cherche à m'assurer du '@' dans une chaine !


Et alors ? Ça marche trsè bien. Quel est ton problème ?

Avatar
lhabert
Traduction : tu utilises « *@* » comme pattern. Cela dit, je ne vois pas
pourquoi tu ne veux pas utiliser case...
Avatar
Stephane Chazelas
2007-01-03, 09:57(+00), Nicolas George:
Tu fais des lignes trop longues.

FAb wrote in message :
Genre un grigri du style $(mot/pattern/sub) ?


La notation ${foo%%pattern} enlève pattern à la fin de $foo. Du coup, si
${foo%%pattern} est la chaîne vide, c'est que foo matche pattern.


Ou que $foo est vide.

[ -z "$foo" ] && [ -n "${foo##*@*}" ]

Aussi:

expr "x$foo" : '.*@' > /dev/null

Mais je ne vois pas pourquoi ne pas utiliser case.

case $foo in (*@*) echo OK;; esac

Avec zsh (et peut-être d'autres), [[ $foo == pattern ]] fait ça directement.


Ça vient de ksh. Aussi dans bash.

--
Stéphane


Avatar
Stephane Chazelas
2007-01-03, 10:42(+00), Stephane Chazelas:
2007-01-03, 09:57(+00), Nicolas George:
Tu fais des lignes trop longues.

FAb wrote in message :
Genre un grigri du style $(mot/pattern/sub) ?


La notation ${foo%%pattern} enlève pattern à la fin de $foo. Du coup, si
${foo%%pattern} est la chaîne vide, c'est que foo matche pattern.


Ou que $foo est vide.

[ -z "$foo" ] && [ -n "${foo##*@*}" ]
[...]


[ -n "$foo" ] && [ -z "${foo##*@*}" ]

--
Stéphane



Avatar
FAb
Nicolas George <nicolas$ writes:

FAb wrote in message :
Bien essayé ! J'avais vu !
Mais je cherche à m'assurer du '@' dans une chaine !


Et alors ? Ça marche trsè bien. Quel est ton problème ?


Bin non cela ne fonctionne pas car le '@' est dans la chaîne, ni au début ni à
la fin...
Par contre, je peux tester si ma chaine est égale ${chaine/@/}.
Merci j'avais besoin de remettre ça à plat.

FAb


Avatar
Nicolas George
FAb wrote in message :
Bin non cela ne fonctionne pas car le '@' est dans la chaîne, ni au
début ni à la fin...


Mais c'est bien pour ça qu'on utilise des motifs, et pas de simples chaînes
constantes : le motif, c'est *@*, mais @ tout court.

Avatar
FAb
Stephane Chazelas writes:

2007-01-03, 10:42(+00), Stephane Chazelas:
2007-01-03, 09:57(+00), Nicolas George:
Tu fais des lignes trop longues.

FAb wrote in message :
Genre un grigri du style $(mot/pattern/sub) ?


La notation ${foo%%pattern} enlève pattern à la fin de $foo. Du coup, si
${foo%%pattern} est la chaîne vide, c'est que foo matche pattern.


Ou que $foo est vide.

[ -z "$foo" ] && [ -n "${foo##*@*}" ]
[...]


[ -n "$foo" ] && [ -z "${foo##*@*}" ]


Merci à tous.
Pourquoi ne pas utiliser case ? J'ai pas dit ça ! Je me doutais qu'il y avait
d'autres manières de faire. C'était donc une occasion d'apprendre et mettre à
jour mes grimoires :-D

Je pense garder :
[ -n "$A"-a -z "${A##*@*}"] && echo ßuper"


FAb




Avatar
Stephane Chazelas
2007-01-03, 11:54(+01), FAb:
Stephane Chazelas writes:

2007-01-03, 10:42(+00), Stephane Chazelas:
2007-01-03, 09:57(+00), Nicolas George:
Tu fais des lignes trop longues.

FAb wrote in message :
Genre un grigri du style $(mot/pattern/sub) ?


La notation ${foo%%pattern} enlève pattern à la fin de $foo. Du coup, si
${foo%%pattern} est la chaîne vide, c'est que foo matche pattern.


Ou que $foo est vide.

[ -z "$foo" ] && [ -n "${foo##*@*}" ]
[...]


[ -n "$foo" ] && [ -z "${foo##*@*}" ]


Merci à tous.
Pourquoi ne pas utiliser case ? J'ai pas dit ça ! Je me doutais qu'il y avait
d'autres manières de faire. C'était donc une occasion d'apprendre et mettre à
jour mes grimoires :-D

Je pense garder :
[ -n "$A"-a -z "${A##*@*}"] && echo ßuper"
[...]


Ne pas utiliser "-a" ou "-o"! Utiliser && et || a la place.

$ A='=' bash -c '[ -n "$A" -a -z "${A##*@*}" ]'
bash: line 0: [: too many arguments
$ A='=' bash -c '[ -n "$A" ] && [ -z "${A##*@*}" ]'
$

--
Stéphane





1 2