while sintaxis sentencias scripts script funciones else ejemplos control comando bash loops do-while

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:

  1. 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

  2. O:

    while : ; do actions [[ current_time <= $cutoff ]] || break done