81 votes

Pourquoi les comparaisons de script shell utilisent-elles souvent x$ VAR = xyes ?

Je le vois souvent dans les scripts de build des projets qui utilisent des outils automatiques (autoconf, automake). Quand quelqu'un veut vérifier la valeur d'une variable shell, il utilise fréquemment cet idiome :

if test "x$SHELL_VAR" = "xyes"; then
...

Quel est l'avantage de ceci par rapport à la simple vérification de la valeur comme ceci :

if test $SHELL_VAR = "yes"; then
...

Je pense qu'il doit y avoir une raison pour que je voie ça si souvent, mais je n'arrive pas à comprendre ce que c'est.

5voto

Ciro Santilli Points 3341

Je recommande plutôt :

if test "yes" = "$SHELL_VAR"; then

puisqu' il élimine le moche x, et résout toujours le problème mentionné par https://stackoverflow.com/a/174288/895245 que $SHELL_VAR peut commencer par - et être lu comme une option.

2voto

Kent Fredric Points 35592

Je crois que c'est dû à

SHELLVAR=$(true)
if test $SHELLVAR  = "yes" ; then echo "yep" ; fi 

# bash: test: =: unary operator expected

ainsi que

if test $UNDEFINEDED = "yes" ; then echo "yep" ; fi
# bash: test: =: unary operator expected

et

SHELLVAR=" hello" 
if test $SHELLVAR = "hello" ; then echo "yep" ; fi
# yep 

cependant, cela devrait généralement fonctionner

SHELLVAR=" hello"
if test "$SHELLVAR" = "hello" ; then echo "yep" ; fi 
#<no output>

mais quand il se plaint en sortie ailleurs, c'est difficile de dire à quoi il se plaint je suppose, donc

SHELLVAR=" hello"
if test "x$SHELLVAR" = "xhello" ; then echo "yep" ; fi 

fonctionne aussi bien, mais serait plus facile à déboguer.

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