Veo el mismo comportamiento para el ciclo a continuación que el ciclo con while [ 1 ]
. ¿Por qué es así?
while [ 0 ]; do
echo "hello"
done
Los corchetes individuales en el shell son sinónimo de test
(ya sea el comando separado o el shell incorporado), por lo que [ 0 ]
significa lo mismo que test 0
. test
es para hacer comparaciones y probar los atributos de los archivos, como puede leer en su página de manual. Cuando no se le da una expresión que se parezca a una comparación, prueba de archivo o una de las otras operaciones que puede hacer, en su lugar probará si el argumento está presente y es una cadena no vacía. Ninguna 0
o 1
son entradas realmente apropiadas para la prueba, y como prueba de cadenas no vacías simplemente tiene éxito y su bucle while se repite para siempre.
Quizás quieras probar en su lugar
while false; do
echo "hello"
done
posiblemente reemplazando false
con true
. O tal vez lo que quieres es usar (( ))
:
while (( 0 )); do
echo "hello"
done
Que se comportará como la mayoría de los idiomas, donde 0 significa falla / falso y 1 significa éxito / verdadero.
[ ]
(sin argumento) y[ "" ]
(con un solo argumento vacío) no tienen éxito.0
y1
no son cadenas vacías. Los nuevos programadores de shell a menudo escriben enif [ 1=2 ]
lugar deif [ 1 = 2 ]
y se preguntan por qué el primero siempre es cierto. Es cierto porque es un argumento único y no es una cadena vacía.El valor 0 aquí no actúa como una constante numérica, sino como una cadena de caracteres. Estas pruebas son todas equivalentes en su efecto de producir un estado de terminación exitoso:
estos producen un estado de terminación fallido:
hay un argumento no en blanco, que se evalúa como verdadero lógico. Esto le permite hacer cosas como:
La variable
UNDER_NUCLEAR_ATTACK
se establece en cualquier valor que no esté en blanco para indicar verdadero, o está desarmado o vacío para indicar falso.Podemos aplicar el
!
operador para invertir la lógica:Para evaluar una condición numérica, debe usar operadores de prueba numéricos:
Si
A
yB
contienen cadenas que parecen enteros decimales, se comparan como números, y siA
es mayor queB
, el bucle se ejecuta. Supongamos queUNDER_NUCLEAR_ATTACK
no es un booleano de tipo cadena que está en blanco o no en blanco, sino que es un booleano numérico que es0
(falso) o algún otro valor (verdadero). En ese caso, escribiríamos la prueba así:fuente
En resumen, está devolviendo un resultado de prueba de cero.
http://www.tldp.org/LDP/abs/html/testconstructs.html
fuente
[
obtiene solo un argumento (excluyendo el]
, por supuesto) sale con el estado cero si el argumento no está vacío, distinto de cero si lo está. Entonces, por ejemplo,[ 1 ]
también devolverá un código de salida de0
.El valor 0 se considera verdadero para el ciclo while, por lo tanto, la condición para el ciclo while es verdadero y, por lo tanto, es continuo para mostrar el ciclo infinito. El es verdadero si reemplazamos 0 con 1, ya que cualquier entero que escribamos entre la condición devolverá verdadero
fuente