¿Cuál es la mejor manera de emular un bucle do-while en Bash?
Podría verificar la condición antes de ingresar al whileciclo, 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_presentsi se inicia después de ese $cutofftiempo, y un do-while lo haría.

untilinterruptor?untiltambié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".truees un programa real mientras que:está integrado. El primero simplemente sale con0(yfalsecon1) el último no hace absolutamente nada. Puedes consultar conwhich true.:todavía se puede usar en lugar detrueen Bash. Prueba conwhile :; do echo 1; done.trueno está integrado en Bash. Es un programa que generalmente se encuentra en/bin.type trueen bash (todo el camino de regreso a bash 3.2) regresatrue is a shell builtin. Es cierto que/bin/truees un programa; Lo que no es cierto acerca de la verdad es quetrueno es una construcción. (tl; dr: true es un bash incorporado y un programa)Coloque el cuerpo de su asa después de
whiley antes de la prueba. El cuerpo real delwhilebucle debe ser un no-op.En lugar del colon, puede usarlo
continuesi 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 lawhilecondició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; donesalidas "aquí"Podemos emular un bucle do-while en Bash con
while [[condition]]; do true; doneeste: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