2009-11-26 11 views
5

estoy mirando a través de algunos scripts de shell - ¿cuál es el propósito de la x en la shcu comarison como

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

Ya se ha preguntado y respondido (incluso varias veces, supongo) – soulmerge

+3

@soulmerge: enlaces –

+1

El enlace está visible para aquellos que pueden cerrar preguntas. Los publicaré junto con el comentario a partir de ahora: http://stackoverflow.com/questions/1398994/shell-script-test – soulmerge

Respuesta

13

Es un truco para asegurarse de no obtener una cadena vacía en la sustitución si una de las variables está vacía. Al poner x en ambos lados, es lo mismo que simplemente comparar las variables directamente, pero las dos partes siempre estarán no vacías.

Es un viejo kludge que hizo más sentido cuando guiones fueron escritos como:

if [ x$USER != x$RUN_AS_USER ] 

No si usted acaba de tener $USER y estuviera vacío, entonces podría terminar con

if [ != root ] # Syntax error 

Con el x obtienes esto, que es mejor:

if [ x != xroot ] 

Sin embargo, cuando se citan las variables, no es necesario x, ya que una cadena vacía entre comillas no se elimina por completo. Todavía aparece como un token. Por lo tanto,

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

es la mejor manera de escribir esto. En el peor de los casos con ambas variables se vacían se obtendría esta que es una declaración válida:

if [ "" != "" ] 
+0

Y no importa si '$ USER' es '-f' porque hay tres argumentos para probar, por lo que debe ser una desigualdad y no una operación de prueba de archivo. –

1

Si las variables son una cadena vacía o no inicializado , sin la x la if se vería así después de la sustitución de variables:

if [ != ]; then 

y por lo tanto sería un error porque los operandos están desaparecidos. Con la x, la if se parece a esto:

if [ x != x]; then 

que es sintácticamente válida.

6

El problema está relacionado con los valores de los bichos raros, como sugiere Cristian Ciupitu, pero las cadenas vacías no son el problema (al menos, no cuando se cita el valor como un todo). El problema está relacionado con nombres que podrían confundirse con operadores para probar (o '['; en algunos sistemas, realmente hay un programa /bin/[). El estándar POSIX casi ha hecho esto redundante, pero considere lo que sucede si '$ USER' es '-f', '$ RUN_AS_USER' está vacío y las x y las comillas no se usan.

if [ -f != ] 
then : someone has a file called '!=' 
else : they don't have a file called '!=' 
fi 

Al utilizar las comillas y la x inicial, se evita este tipo de interpretación errónea.

Cuestiones relacionadas