sintaxis - Emulando un ciclo do-while en Bash
sentencias de control en shell script (3)
¿Cuál es la mejor manera de emular un ciclo do-while en Bash?
Podría verificar la condición antes de ingresar al ciclo while, y luego continuar revisando la condición en el ciclo, pero ese es 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 realiza check_if_file_present
si se lanza después del tiempo $cutoff
, y un do-while lo haría.
En lugar de los dos puntos, puede continuar si lo encuentra más legible
Mi reputación es demasiado baja para dejar un comentario sobre la publicación de Dennis Williamson. Este método imita la forma de hacer los bucles Do-While que estaba buscando: tener la prueba de condición después de las acciones. También encontré que puedo colocar un incremento de índice (si es necesario) después de la instrucción do, en lugar de una instrucción continue.
while
check_if_file_present
#do other stuff
(( current_time <= cutoff ))
do
(( index++ ));
done
Coloque el cuerpo de su lazo después del while
y antes de la prueba. El cuerpo real del ciclo while debería ser no operativo.
while
check_if_file_present
#do other stuff
(( current_time <= cutoff ))
do
:
done
En lugar de los dos puntos, puede continue
si lo encuentra más legible
Cambié la prueba para usar doble paréntesis ya que pareces estar comparando números enteros. Dentro de los corchetes dobles, los operadores de comparación como <=
son léxicos y darán el resultado incorrecto al comparar 2 y 10, por ejemplo. Esos operadores no funcionan dentro de corchetes individuales.
Dos soluciones simples:
Ejecute su código una vez antes del ciclo while
actions() { check_if_file_present # Do other stuff } actions #1st execution while [ current_time <= $cutoff ]; do actions # Loop execution done
O:
while : ; do actions [[ current_time <= $cutoff ]] || break done