Comparaison avec Expression régulière en CSH

Ygnizem -  
mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je me retrouve confronté à un problème dans un script en csh.


#!/bin/csh

if ( $1 !~ "^texte.*" ) then
	echo Lu

else
       echo A lire
endif



Je saisis donc un paramètre ( qui sera réutilisé dans le script par le $1) lorsque je lance le script.


Mon problème se situe au niveau de la comparaison du paramètre (chaîne de caractères) avec le 'pattern' (expression régulière):

- Si je rentre le paramètre "texte", le script m'affiche "A lire", ça c'est normal.
-Si je rentre un paramètre qui ne correspond pas au pattern, le script m'affiche EGALEMENT "A lire" à la place de "Lu".

Il y a donc j'imagine une erreur dans l'expression régulière ou la syntaxe du if, mais après avoir testé longtemps, je n'ai toujours pas de résultat correct.


Auriez-vous des pistes?

Merci bien!


A voir également:

1 réponse

mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Je ne fais pas de csh mais tu es sûr de la syntaxe de ton "if ... then ... endif" ? En shell standard c'est plutôt :

if [ condition ] ; then  
  ...  
else  
  ...  
fi


De plus pour ce programme, csh ne me parraît pas nécessaire, un simple "grep -q" doit suffire. C'est un peu dommage quand on sait que csh n'est pas installé en général alors qu'ici n'importe quelle shell (sh, qui souvent pointe sur dash ou bash) suffit amplement.

(mando@aldur) (~) $ echo "texte.truc" | grep -q "^texte\."  
(mando@aldur) (~) $ echo $?  
0  
(mando@aldur) (~) $ echo "toxte.truc" | grep -q "^texte\."  
(mando@aldur) (~) $ echo $?  
1  


Exemple :

if [ $(echo $1 | grep -q "^texte\.") ] ; then  
  ...  
else  
  ...  
fi


L'option -q va permettre de voir si le motif est trouvé (code d'exécution 0) ou non (code d'exécution 1) et rentrer en conséquence dans le if ou non. L'opérateur $(...) permet d'évaluer le résultat d'une commande (ici echo $1 | grep -q "^texte\.") et d'injecter le résultat dans le test.

Enfin, ton expression régulière est incorrecte car "." ne désigne pas le caractère . (ça, c'est le symbole \. ou [.]), mais n'importe quel caractère excepté \0, \n et \r. De même le caractère * ne désigne pas n'importe quelle suite de caractère (wildcard) mais une répétition entre 0 et l'infini. Je t'invite à prendre quelques minutes pour lire la sytnaxe des expressions régulières, par exemple dans :

man grep


Bonne chance
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
Salut mamie,

Je ne fais pas de csh mais tu es sûr de la syntaxe de ton "if ... then ... endif" ? En shell standard c'est plutôt : ...
Oui, oui, c'est bien la bonne, en csh elle est totalement différente des shells conventionnels ;-(
0
mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Merci pour la précision ;-)
0