2011-10-25 10 views
5

En mi fiesta de test tiene una actitud para salir con el estado 0:BASH: [] (prueba) se comporta unconformly

$ test -n && echo true || echo false 
-> true 

mientras

$ test -n "" && echo true || echo false 
-> false 

Significa que cuando no recibe ningún argumento en absoluto, asume que no es cero.

El caso -z funciona correctamente en su lugar:

$ test -z && echo true || echo false 
-> true 
$ test -z "" && echo true || echo false 
-> true 

es éste el comportamiento esperado?

+0

Buena pregunta. Me pregunto también por qué tanto 'test -n' como' test -z' (sin argumentos) tienen éxito. –

+0

¡Preste atención con '&&' y '||'! Pruebe este código: 'toque ~/x && touch/x || echo fail' - si 'touch/x' falla,' fail' se imprimirá! – uzsolt

Respuesta

5

Básicamente, usted está preguntando si la cadena "-z" no está vacía. Es así que te dice true. El algoritmo real utiliza prueba es:

  • 0 argumentos:

    Exit falso (1).

  • 1 argumento:

    salida verdadero (0) si $ 1 no es nulo; de lo contrario, sale falso.

  • 2 argumentos:

    Si $ 1 es, la salida verdadera si $ 2 es nulo, falso si $ 2 no es nulo ''.

    Si $ 1 es un primario único, salga verdadero si la prueba única es verdadera, falso si la prueba unaria es falsa.

    De lo contrario, no se especifican los resultados.

...

citado de the POSIX test command specification.

0

Sí, se espera.

$ man test 
-n string     True if the length of string is 
          non-zero. 
-z string     True if the length of string 
          string is zero. 

test [option] #without any operand devuelve un estado de salida que es cierto para TODAS opciones.

Prueba estas:

test -d 
test -f 
test -n 
test -G 
test -k 
... 
+0

Esto no ayuda al OP.El OP sabe cómo funciona _with_ un argumento. La pregunta es sobre el comportamiento de '-n' _sin un argumento_ y por qué diablos se considera' verdad'. –

+0

No realmente, prueba con un operador y sin un operando devuelve verdadero a TODAS las opciones. Edité la respuesta. – aayoubi

1

Presumiblemente, sin argumentos "-n" y "z" no son tratados como los operadores, sino como simples cadenas, y test "a non-empty string" es cierto. Supongo que test cuenta sus argumentos como primer paso, y si el recuento es 1, simplemente examine la longitud del argumento.

+0

Esta es una buena explicación. En realidad, esta teoría funciona y no contrasta el Manual, que en ninguna parte especifica que los parámetros se interpretan ANTES de los argumentos. – davide

Cuestiones relacionadas