2010-10-13 11 views
7

En escritura del golpe¿Cómo la palabra clave does "prueba" si un valor es verdadero de falso?

if [ 1 ] 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

de salida: Yes

representa que '1' se trata como valor real.

Pero en código:

word = Linux 
letter = nuxi 
if echo "$word" | grep -q "$letter" 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

de salida: No se

Pero echo "$word" | grep -q "$letter" volverá 1, ¿por qué el resultado es el número

cómo la palabra clave if prueba el valor devuelto por el comando después de if?

+0

Usted puede encontrar [mi respuesta aquí] (http://stackoverflow.com/questions/3869072/test-for-non-zero-length-string-in-bash-n-var-or-var/3870055 # 3870055) para ser útil. –

Respuesta

8

El valor de retorno de un comando está marcado. [ 1 ] tiene un valor de retorno de 0 (verdadero). Cualquier otro valor devuelto (como 1) indica un error.

Se puede visualizar el valor de retorno del último comando ejecutado utilizando la variable $?:

true 
echo $? 
# returned 0 
false 
echo $? 
# returned 1 
echo $? 
# returned 0 as the last executed command is 'echo', and not 'false' 
+0

Ah, ¿es porque '[' es un shell incorporado, devolverá 0 cuando complete la función de prueba? –

+0

Parece que '0' es una expresión que se evalúa como' verdadera'. '[0 = 1]' tiene un valor de retorno de '1' (valor esperado) y' [0 = 0] 'tiene un valor de retorno de' 0'. Ejecute 'prueba hombre' para obtener más información sobre' prueba' (también conocido como '[') – Lekensteyn

+3

'[1]' o '[0]' evalúa como verdadero porque 'prueba' /' ['con parámetro único simplemente comprueba si la cadena del parámetro (aquí '1' o' 0') no está vacío.iow '[" "]' sería falso. – Dummy00001

0

Esto es debido a que el grep no logró encontrar la letra $ en $ palabra, por lo tanto, el código de salida es 1. Siempre un proceso en Linux devuelve un código distinto de 0, entonces significa que falló. 0 significa salido exitosamente. Puede verificar esto por echo "Linux" | grep -d "nuxi"; echo $?

Por otro lado en el mundo de scripting 0 significa falso y 1 verdadero verdadero. Entonces grep no pudo encontrar la palabra y envió 1 como un código de salida a if, que lo tomó como un valor verdadero.

7

En tierra de unix, 0 es verdadero y 1 es falso.

Para su primer ejemplo:

if [ 1 ] 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

"Si" comprueba el código de salida del comando dado por verdadero/falso (es decir, cero/no-cero).

Los corchetes en realidad invocan el comando "prueba" (ver "prueba de hombre" para más información) y dan el código de salida a si.

"test 1" (o de hecho "test any_string") devuelve true (0) por lo que se emite "Yes".

Para su segundo ejemplo, este da como resultado "No" porque "nuxi" no se encuentra en "Linux", si cambia "nuxi" por "nux" (quizás esto era un error?) Y elimina los espacios alrededor the = entonces obtendrá el comportamiento que espera. p.ej.

word=Linux 
letter=nux 
if echo "$word" | grep -q "$letter" 
then 
    echo "Yes" 
else 
    echo "No" 
fi 
Cuestiones relacionadas