Эмуляция цикла do-while в Bash
каков наилучший способ эмуляции цикла do-while в Bash?
Я мог бы проверить состояние перед входом в while цикл, а затем продолжить повторную проверку условия в цикле, но это дублированный код. Есть ли более рациональный способ?
псевдо код моего скрипта:
while [ current_time <= $cutoff ]; do
check_if_file_present
#do other stuff
done
это не делает check_if_file_present Если запущен после $cutoff время и сделать хотя бы.
3 ответа:
два простых решения:
выполнить код один раз перед циклом while
actions() { check_if_file_present # Do other stuff } actions #1st execution while [ current_time <= $cutoff ]; do actions # Loop execution doneили:
while : ; do actions [[ current_time <= $cutoff ]] || break done
поместите тело вашего цикла после
whileи перед тестом. Фактическое телоwhileцикл должен быть no-op.while check_if_file_present #do other stuff (( current_time <= cutoff )) do : doneвместо двоеточия можно использовать
continueЕсли вы найдете, что более читаемымЯ изменил тест, чтобы использовать двойные скобки, так как вы, кажется, сравниваете целые числа. Внутри двойных квадратных скобок, операторы сравнения, такие как
<=являются лексическими и дадут неправильный результат при сравнении 2 и 10, например. Те операторы не работают внутри одиночных квадратных скобок.
вместо двоеточия, вы можете использовать продолжить, если вы найдете, что более читаемым
моя репутация слишком низка, чтобы оставить комментарий на пост Денис Уильямсон. Этот метод имитирует способ выполнения циклов Do-While, которые я искал, чтобы иметь тест состояния после действий. Я также обнаружил, что могу разместить приращение индекса (при необходимости) после оператора do вместо оператора continue.
while check_if_file_present #do other stuff (( current_time <= cutoff )) do (( index++ )); done