Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

test en bash

6 réponses
Avatar
Professeur M
question probablement neuneu, mais justement je suis neuneu en bash...

pour tester si $c fait parti d'un ensemble fini et connu de chaînes
de 3 caractères, existe-t-il une écriture plus propre et concise que :

if [ "$c" == "foo" -o "$c" == "bar" -o "$c" == "bla" -o "$c" == "pop" -o "$c" == "hue" ]
then

fi


(en tout une quinzaine de chaînes à tester)

Méphisto

6 réponses

Avatar
Luc.Habert.00__arjf
Professeur Méphisto:

pour tester si $c fait parti d'un ensemble fini et connu de chaînes
de 3 caractères



Perso, je fais

case $c in
foo|bar|blah|pop) do something;;
esac

Tu peux utiliser les mêmes patterns que dans les noms de fichiers, ça peut
réduire le nombre de cas. Sinon, il y a fgrep.
Avatar
Professeur M
Le Tue, 04 Dec 2012 14:05:22 +0000, Luc Habert a écrit :

merci, c'est adopté...


foo|bar|blah|pop) do something;;


^^

arg... un quart d'heure pour penser à ne PAS mettre la commande do ici...
Avatar
Luc.Habert.00__arjf
Francois Lafont :

if echo ":$c:" | grep -q ":foo:bar:bla:hop:"; then



Ton grep ne va matcher que ce qui contient

:foo:bar:bla:hop:

, donc pas ce que l'on souhaite. Avec grep, tu peux faire

grep -x -e foo -e bar -e bla -e hop

(et même utiliser fgrep, il se peut que ce soit plus efficace), ou

grep -x 'foo|bar|blah|hop'

. Mais ça peut faire un faux positif si ton $c contient plusieurs lignes.
Donc le case me parait plus propre.
Avatar
Francois Lafont
Le 05/12/2012 01:47, Luc Habert a écrit :

if echo ":$c:" | grep -q ":foo:bar:bla:hop:"; then



Ton grep ne va matcher que ce qui contient

:foo:bar:bla:hop:



Heu oui, désolé. Il est tard et je ne vois pas clair. En fait, je
voulais dire :

if echo ":foo:bar:bla:hop:" | grep -q ":$c:"; then

et encore je me rend compte que si "$c" == "foo:bar", ça va correspondre
alors qu'il ne faudrait pas. Donc j'ai tout faux. :-)

, donc pas ce que l'on souhaite. Avec grep, tu peux faire

grep -x -e foo -e bar -e bla -e hop



Ah oui, voilà, avec l'option -x c'est bien. Je ne connaissais pas.
Merci. Ça peut éviter de mettre des -e "^foo$" partout.

grep -x 'foo|bar|blah|hop'

. Mais ça peut faire un faux positif si ton $c contient plusieurs lignes.
Donc le case me parait plus propre.



Absolument d'accord, ya pas à tortiller. :-)
Merci pour les précisions.

--
François Lafont
Avatar
Nicolas George
Francois Lafont , dans le message
<50be9388$0$1928$, a écrit :
Sinon, juste au passage, d'après ce que j'ai pu lire ici ou là, un test
d'égalité en bash se fait avec un seul « = » (mais effectivement « == »)
marche aussi.



Petite précision : il ne s'agit pas de bash mais de la commande [ ; elle est
probablement en builtin de bash, mais ça pourrait très bien être une
commande externe.
Avatar
Francois Lafont
Le 05/12/2012 09:15, Nicolas George a écrit :

Petite précision : il ne s'agit pas de bash mais de la commande [ ; elle est
probablement en builtin de bash, mais ça pourrait très bien être une
commande externe.



Ok. Effectivement elle est bien builtin mais j'ai aussi [ dans le path.

$ type [
[ est une primitive du shell
$ which [
/usr/bin/[

Et « man [ » me renvoie d'ailleurs vers une page de manuel (celle de
test en l'occurrence).

Merci.

--
François Lafont