353 votes

Comment représenter plusieurs conditions dans un script shell?

Je veux représenter plusieurs conditions comme ceci:

 if [ ( $g -eq 1 -a "$c" = "123" ) -o ( $g -eq 2 -a "$c" = "456" ) ]   
then  
    echo abc;  
else  
    echo efg;   
fi  
 

mais quand j'exécute le script, il montre

 syntax error at line 15: `[' unexpected, 
 

où la ligne 15 est celle qui indique si ....

Quel est le problème avec cette condition? Je suppose que quelque chose ne va pas avec ().

430voto

Jonathan Leffler Points 299946

Technique classique d'échappement des caractères de remplacement):

if [ \( $g -eq 1 -a "$c" = "123" \) -o \( $g -eq 2 -a "$c" = "456" \) ]
then echo abc
else echo efg
fi

J'ai essayé différents trucs avec '[[ ... ]]"sans succès - même échapper à l'parenthèses n'a pas l'air de fonctionner.


N'est-ce pas une question classique?

J'aurais pensé. Cependant, il existe une alternative, à savoir:

if [ $g -eq 1 -a "$c" = "123" ] || [ $g -eq 2 -a "$c" = "456" ]
then echo abc
else echo efg
fi

En effet, si vous lisez le "portable shell" lignes directrices pour l' autoconf outil ou les paquets relatifs à cette notation en utilisant"||"et"&&' - est ce qu'ils recommandent. Je suppose que vous pourriez même aller aussi loin que:

if [ $g -eq 1 ] && [ "$c" = "123" ]
then echo abc
elif [ $g -eq 2 ] && [ "$c" = "456" ]
then echo abc
else echo efg
fi

D'où les actions sont aussi trivial comme en écho, ce n'est pas mauvais. Lorsque l'action du bloc est répété plusieurs lignes, la répétition est trop douloureux et l'une des versions précédentes est préférable.

209voto

Dennis Williamson Points 105818

Dans Bash:

 if [[ ( $g == 1 && $c == 123 ) || ( $g == 2 && $c == 456 ) ]]
 

9voto

orkoden Points 2262

Faites attention si vous avez des espaces dans vos variables de chaîne et vérifiez leur existence. Assurez-vous que les citons correctement.

 if [ ! "${somepath}" ] || [ ! "${otherstring}" ] || [ ! "${barstring}" ] ; then
 

6voto

ghostdog74 Points 86060
$ g=3
$ c=133
$ ([ "$g$c" = "1123" ] || [ "$g$c" = "2456" ]) && echo "abc" || echo "efg"
efg
$ g=1
$ c=123
$ ([ "$g$c" = "1123" ] || [ "$g$c" = "2456" ]) && echo "abc" || echo "efg"
abc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X