Otras respuestas le dieron una solución, pero explicaré qué estaba mal con el pensamiento original.
Las variables Bash no tienen tipos, por lo que no existe una variable booleana o un valor como verdadero o falso. Básicamente, todas las variables 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 cadena-n
(de longitud distinta de cero ).
Entonces [ "$var" ]
es equivalente a [ -n "$var" ]
. Siempre que $var
contenga al menos 1 carácter, se evaluará como verdadero.
Como negaste la expresión, [ ! "$var" ]
es equivalente a [ ! -n "$var" ]
. Entonces, si $var
contiene al menos 1 carácter, entonces la expresión es falsa.
Comofalse
(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 phone_missing
tiene una longitud distinta de cero. La única forma de hacerlo true
es phone_missing=""
ya que tiene una longitud cero.
Не используйте строку для логического значения. Используйте целое число.
Вход:
val=1
((val)) && echo "true" || echo "false"
val=0
((val)) && echo "true" || echo "false"
Выход:
true
false
((expression))
The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION. If the value of the expression is non-zero, the return status is 0; otherwise the return status is 1. This is exactly equivalent to let "expression".