2009-11-26 5 views
5

je jeter un oeil à travers quelques scripts shell - quel est le but du x dans le shcu de comarison comme

if [ "x$USER" != "x$RUN_AS_USER" ]; then 
     su - $RUN_AS_USER -c "$CATALINA_HOME/bin/startup.sh" 
else 
     $CATALINA_HOME/bin/startup.sh 
fi 
+0

A déjà été demandé et répondu (même plusieurs fois, je suppose) – soulmerge

+3

@soulmerge: liens s'il vous plaît –

+1

Le lien est visible pour ceux qui peuvent fermer des questions. Je les posterai avec le commentaire à partir de maintenant: http://stackoverflow.com/questions/1398994/shell-script-test – soulmerge

Répondre

13

C'est un truc pour s'assurer que vous n'obtenez pas une chaîne vide dans la substitution si l'une des variables est vide. En mettant x des deux côtés, cela revient à comparer directement les variables, mais les deux côtés seront toujours non vides.

Il est un vieux bidouille qui a fait plus de sens quand les scripts ont été écrits comme:

if [ x$USER != x$RUN_AS_USER ] 

Il si vous aviez juste $USER et il était vide alors vous pourriez finir avec

if [ != root ] # Syntax error 

Avec la x vous obtenez ce qui est mieux:

if [ x != xroot ] 

Cependant, lorsque les variables sont citées, le x est inutile car une chaîne vide entre guillemets n'est pas entièrement supprimée. Il apparaît toujours comme un jeton. Ainsi,

if [ "$USER" != "$RUN_AS_USER" ] # Best 

est la meilleure façon d'écrire ceci. Dans le pire des cas avec les deux variables vide, vous obtiendrez ce qui est une déclaration valide:

if [ "" != "" ] 
+0

Et cela n'a pas d'importance si '$ USER' est '-f' parce qu'il y a trois arguments à tester, il doit donc s'agir d'une opération d'inégalité et non d'un test de fichier. –

1

Si les variables sont une chaîne vide ou non initialisée , sans le x le if ressemblerait à ceci après la substitution de variable:

if [ != ]; then 

et donc il échouerait parce que les opérandes manquent. Avec le x, le if ressemble à ceci:

if [ x != x]; then 

qui est syntaxiquement valide.

6

Le problème est lié aux valeurs-ball étrange, comme Cristian Ciupitu suggère, mais les chaînes vides ne sont pas le problème (au moins, pas quand la valeur dans son ensemble est citée). Le problème est lié à des noms qui pourraient être confondus avec les opérateurs à tester (ou '['; sur certains systèmes, il y a vraiment un programme /bin/[). La norme POSIX a presque rendu cette fonction redondante, mais considérons ce qui se passe si '$ USER' est '-f', '$ RUN_AS_USER' est vide et que les x et les guillemets ne sont pas utilisés. En utilisant les guillemets et le premier x, on évite ce genre d'erreur d'interprétation.

Questions connexes