¿Cuál es la mejor manera de emular un bucle do-while en Bash?
Podría verificar la condición antes de ingresar al while
ciclo, y luego continuar volviendo a verificar la condición en el ciclo, pero ese es un código duplicado. ¿Hay una manera más limpia?
Pseudo código de mi script:
while [ current_time <= $cutoff ]; do
check_if_file_present
#do other stuff
done
Esto no funciona check_if_file_present
si se inicia después de ese $cutoff
tiempo, y un do-while lo haría.
until
interruptor?until
también evaluará la condición antes de ejecutar el cuerpo del bucleRespuestas:
Dos soluciones simples:
Ejecute su código una vez antes del ciclo while
O:
fuente
:
es un empotrado, equivalente al empotradotrue
. Ambos "no hacen nada con éxito".true
es un programa real mientras que:
está integrado. El primero simplemente sale con0
(yfalse
con1
) el último no hace absolutamente nada. Puedes consultar conwhich true
.:
todavía se puede usar en lugar detrue
en Bash. Prueba conwhile :; do echo 1; done
.true
no está integrado en Bash. Es un programa que generalmente se encuentra en/bin
.type true
en bash (todo el camino de regreso a bash 3.2) regresatrue is a shell builtin
. Es cierto que/bin/true
es un programa; Lo que no es cierto acerca de la verdad es quetrue
no es una construcción. (tl; dr: true es un bash incorporado y un programa)Coloque el cuerpo de su asa después de
while
y antes de la prueba. El cuerpo real delwhile
bucle debe ser un no-op.En lugar del colon, puede usarlo
continue
si lo encuentra más legible. También puede insertar un comando que solo se ejecutará entre iteraciones (no antes del primero o después del último), comoecho "Retrying in five seconds"; sleep 5
. O imprima delimitadores entre valores:Cambié la prueba para usar paréntesis dobles ya que parece que estás comparando enteros. Dentro de los corchetes dobles, los operadores de comparación como
<=
son léxicos y darán un resultado incorrecto al comparar 2 y 10, por ejemplo. Esos operadores no trabajan dentro de corchetes individuales.fuente
while { check_if_file_present; ((current_time<=cutoff)); }; do :; done
? Es decir, ¿los comandos dentro de lawhile
condición están efectivamente separados por punto y coma, no por ejemplo&&
, y agrupados por{}
?&&
o||
ya que efectivamente los hace parte de la prueba que controla elwhile
. A menos que esté utilizando esta construcción en la línea de comando, no lo haría como una línea (en un script, específicamente) ya que la intención es ilegible.while false; false; false; true; do echo here; break; done
salidas "aquí"Podemos emular un bucle do-while en Bash con
while [[condition]]; do true; done
este:Para un ejemplo. Aquí está mi implementación para obtener conexión ssh en script bash:
Dará la salida en secuencia de la siguiente manera:
fuente