Esta pregunta ya tiene respuestas aquí :
Respuesta
Respuesta
A menudo uso «verdadero» y «falso» ya que también son comandos que simplemente devuelven éxito y fracaso respectivamente. Entonces puedes hacer
if "$phone_missing"; then ...
Responder
Aquí tienes una forma de hacerlo esto, conservando los valores verdadero / falso.
phone_missing=false if [ "$phone_missing" != false ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi if [ "$phone_missing" == true ]; then echo "phone_missing is true." fi
Las comillas dobles alrededor $phone_missing
son para proteger contra el caso en el que la variable phone_missing
no está definida en absoluto. Otro modismo común para evitar esto es [ x$phone_missing != xfalse ]
, pero las comillas me parecen más naturales.
La pista está en la página de ayuda de bash
para test
:
STRING True if string is not empty. ... ! EXPR True if expr is false.
Entonces, básicamente [ $foo ]
será verdadero si $foo
no está vacío. No es verdadero o falso, solo no está vacío. [ ! $foo ]
es verdadero si $ foo está vacío o no está definido.
Siempre puede cambiar su código para establecer phone_missing
como no -valor vacío e, que denotará verdadero. Si phone_missing
no está configurado (o está vacío – phone_missing=""
), será falso. De lo contrario, debería utilizar los operadores de prueba de cadenas (=
y !=
).
El otro problema leve es la asignación. Lo tiene como $phone_missing=true
, mientras que debería ser phone_missing=true
(sin signo de dólar).
Lo siento si esto es un poco denso, es porque yo lo soy. Ha sido un día largo. 🙂
Respuesta
Otras respuestas le dieron una solución, pero explicaré qué estaba mal con el pensamiento original.
Las variables de bash no tienen tipos, por lo que no existe una variable booleana o un valor como verdadero o falso. Básicamente, todas las variables de bash son solo cadenas.
Cuando prueba una variable / cadena en bash sin especificar el tipo de prueba (-n
o -z
), por defecto será una prueba de -n
(cadena de longitud distinta de cero).
Entonces [ "$var" ]
es equivalente a [ -n "$var" ]
. Siempre que $var
contenga al menos 1 carácter, se evaluó como verdadero.
Dado que negó la expresión, [ ! "$var" ]
es equivalente a [ ! -n "$var" ]
. Entonces, si $var
contiene al menos 1 carácter, entonces la expresión es falsa.
Dado que false
(que es solo una cadena) contiene 5 caracteres, la expresión es falsa. Si no importa qué cadena establezca phone_missing
en (true
, 0, 1), la expresión siempre será false
porque es phone_missing
es una longitud distinta de cero. La única forma de hacerlo true
es phone_missing=""
ya que la longitud es cero.
Respuesta
No use cadenas para booleanos. Utilice un número entero.
Entrada:
val=1 ((val)) && echo "true" || echo "false" val=0 ((val)) && echo "true" || echo "false"
Salida:
true false
Fuente :
((expresión))
La expresión se evalúa según las reglas descritas a continuación en EVALUACIÓN ARITMÉTICA. Si el valor de la expresión es distinto de cero, el estado de retorno es 0; de lo contrario, el estado de retorno es 1. Esto es exactamente equivalente a dejar «expresión».
Respuesta
Habría hecho esto como comentario para apoyar a James Ko, pero no tenía el representante para comentar o votar públicamente.
El problema aquí es que los corchetes [] son una notación para hacer una prueba de comparación como valor o igualdad de cadenas.
La veracidad de la cadena en bash para una cadena vacía es ""
(cadena vacía) se evalúa como falso (valor de retorno 1) y cualquier cadena no vacía «falso» «verdadero «o» bob «s tu tío» se evalúa como verdadero (valor de retorno 0).
Puedes probarte esto a ti mismo con:
if [ "foo" ]; then echo true is $?; else echo false is $?; fi
El $?
anterior es una variable especial que contiene el estado de salida de los últimos comandos (0 éxito y cualquier> 0 para código de error) y generará true is 0
. Puede reemplazar "foo"
con lo que desee y el resultado será el mismo, excepto si lo reemplaza con una cadena vacía ""
o ""
, en cuyo caso evaluará la condición else y generará false is 1
.
Cuando utilice el [ ] entre paréntesis la declaración interna como! $ phone_missing se evalúa y luego devuelve un 0
para verdadero o 1
para falso al control if l declaración. Dado que el corchete evalúa las comparaciones de cadenas y valores, $ phone_missing se expande primero a la cadena no vacía «falso» que es evaluada por [] como una cadena no vacía (o verdadera) y luego! invierte el resultado que da como resultado que la instrucción if obtenga un valor falso (o devuelva el valor 1) y omite el cuerpo condicional ejecutando la instrucción else si está presente.
Como dijo James Ko, la notación sería simplemente pasar la variable que mantiene su «booleano» en la instrucción de control if. Tenga en cuenta que en bash un booleano verdadero y falso deben estar en minúsculas como en: bool_true = true bool_false = false Cualquier otro caso lo hará evaluar como cadenas y no como booleanos.
Entonces, usando su ejemplo y la respuesta de James Ko, sería:
phone_missing=false echo "missing $phone_missing" if ! $phone_missing then echo "Lost phone at $readabletime" $phone_missing=true fi
o como yo prefiero por legibilidad (sintácticamente lo mismo y James Ko «s)
phone_missing=false echo "missing $phone_missing" if ( ! $phone_missing ); then echo "Lost phone at $readabletime" $phone_missing=true fi
Otras respuestas como las de Alexios están literalmente verificando el contenido de la cadena. De modo que cualquiera de los siguientes resultaría en falso:
phone_missing=false if [ "$phone_missing" != false ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi if [ "$phone_missing" == true ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi if [ "$phone_missing" == Bobs_your_uncle ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi
Respuesta
La sintaxis correcta es if ! $bool; then [statements]; fi
.
Ejemplo:
bool=false if ! $bool; then echo "This is correct!" fi if [ ! $bool ]; then echo "This is wrong!" fi
Salida: This is correct!
Comentarios