2010-09-28 7 views
55

he definido la siguiente variable:¿Cómo evaluar una variable booleana en un bloque if en bash?

myVar=true 

Ahora me gustaría ejecutar algo en la línea de este:

if [ myVar ] 
then 
    echo "true" 
else 
    echo "false" 
fi 

El código anterior funciona, pero si trato de establecer

myVar=false 

seguirá siendo verdadero. ¿Cuál podría ser el problema?

editar: Yo sé que puedo hacer algo de la forma

if [ "$myVar" = "true" ]; then ... 

pero es un poco incómodo.

Gracias

+0

Vea también: http://stackoverflow.com/questions/2953646/how-to-declare-and-use-boolean-variables-in-shell-script/21210966#21210966 –

Respuesta

93

fiesta no sabe variables booleanas, ni test (que es lo que se llama cuando se utiliza [).

Una solución sería:

if $myVar ; then ... ; fi 

porque true y false son comandos que devuelven 0 o 1, respectivamente, que es lo que if Espera.

Tenga en cuenta que los valores se "intercambian". El comando después de if debe devolver 0 en caso de éxito, mientras que 0 significa "falso" en la mayoría de los lenguajes de programación.

ADVERTENCIA DE SEGURIDAD: Esto funciona porque BASH expande la variable y luego intenta ejecutar el resultado como un comando. Asegúrese de que la variable no puede contener código malicioso como rm -rf /

+0

+1 por darme una paliza , y con una buena explicación también :-) –

+1

Podría agregar para no olvidar el '; fi' al final. Entonces es 'si $ myVar; entonces ... ; fi' – IanBussieres

+5

y 'si! $ myVar; entonces ... ; fi' da la opuesta – Pancho

32

Tenga en cuenta que el constructo if $myVar; then ... ;fi tiene un problema de seguridad es posible que desee evitar con

case $myvar in 
    (true) echo "is true";; 
    (false) echo "is false";; 
    (rm -rf*) echo "I just dodged a bullet";; 
esac 

También puede ser que desee volver a pensar qué if [ "$myvar" = "true" ] parece incómodo para usted . Se trata de una comparación de cadenas de shell que supera posiblemente la bifurcación de un proceso solo para obtener un estado de salida. Un tenedor es una operación pesada y costosa, mientras que una comparación de cuerdas es barata. Piense en algunos ciclos de CPU en comparación con varios miles. Mi solución case también se maneja sin horquillas.

+1

'true' y' false' son comandos incorporados en la mayoría de shells.Invocarlos es poco probable que requiera una llamada 'fork()'. –

Cuestiones relacionadas