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

bash et case esac

3 réponses
Avatar
Kevin Denis
Bonjour,

j'ai une variable texte contenant une ligne avec des espaces et différents
caractères.

J'ai besoin de parser cette ligne car différentes actions doivent être
prises selon le début de celle ci.

J'ai choisi d'utiliser case/esac:
case $LINE in
aaa*)
do_aaa
;;
bbb*)
do_bbb
;;
esac

Mais j'ai un problème pour différencier:
aaa blablabla
aaaaa blablabla

Et mes tentatives à base de:
aaa\ .*)
do_aaa
;;
ne fonctionnent pas.

Pourquoi? Ceci j'utilise case/esac mais s'il y a mieux, je prends.

Merci
--
Kevin

3 réponses

Avatar
Nicolas George
Kevin Denis , dans le message
, a écrit :
aaa .*)



Pourquoi mets-tu un point ?

Ceci j'utilise case/esac mais s'il y a mieux, je prends.



Le problème, ce n'est pas case, c'est bash. Pour des tâches un tant soit peu
complexes, il vaut mieux utiliser un vrai langage.
Avatar
Bruno Tréguier
Le 20/07/2011 11:46, Kevin Denis a écrit :
Bonjour,

j'ai une variable texte contenant une ligne avec des espaces et différents
caractères.

J'ai besoin de parser cette ligne car différentes actions doivent être
prises selon le début de celle ci.

J'ai choisi d'utiliser case/esac:
case $LINE in
aaa*)
do_aaa
;;
bbb*)
do_bbb
;;
esac

Mais j'ai un problème pour différencier:
aaa blablabla
aaaaa blablabla

Et mes tentatives à base de:
aaa .*)
do_aaa
;;
ne fonctionnent pas.

Pourquoi? Ceci j'utilise case/esac mais s'il y a mieux, je prends.



Bonjour Kévin,

Si tous les mots de votre ligne sont séparés par des éléments de $IFS
(comme l'espace) et que c'est le premier mot qui détermine le
traitement, vous pouvez toujours contourner le problème en utilisant un
artifice du genre:

set -- $LINE # decompose $LINE dans les parametres positionnels $1 et
suivants

case $1 in
aaa)
do_aaa
;;
etc.

--
Bruno Tréguier
Avatar
Philippe Naudin
Le mer 20 jui 2011 14:43:43 CEST, Bruno Tréguier a écrit:

Le 20/07/2011 11:46, Kevin Denis a écrit :
> Bonjour,
>
> j'ai une variable texte contenant une ligne avec des espaces et diffé rents
> caractères.
>
> J'ai besoin de parser cette ligne car différentes actions doivent ê tre
> prises selon le début de celle ci.
>
> J'ai choisi d'utiliser case/esac:
> case $LINE in
> aaa*)
> do_aaa
> ;;
> bbb*)
> do_bbb
> ;;
> esac
>
> Mais j'ai un problème pour différencier:
> aaa blablabla
> aaaaa blablabla
>
> Et mes tentatives à base de:
> aaa .*)
> do_aaa
> ;;
> ne fonctionnent pas.
>
> Pourquoi? Ceci j'utilise case/esac mais s'il y a mieux, je prends.

Bonjour Kévin,

Si tous les mots de votre ligne sont séparés par des éléments de $IFS
(comme l'espace) et que c'est le premier mot qui détermine le
traitement, vous pouvez toujours contourner le problème en utilisant un
artifice du genre:

set -- $LINE # decompose $LINE dans les parametres positionnels $1 et
suivants

case $1 in
aaa)
do_aaa
;;
etc.




Et aussi :
for LINE in "aaa blablabla" "aaaaa blablabla" ; do
case "$LINE" in
aaa *)
echo $LINE : 3a
;;
aaa*)
echo $LINE : 5a
;;
esac
done

--
Philippe