Эмуляция цикла 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 86

3 ответа:

два простых решения:

  1. выполнить код один раз перед циклом while

    actions() {
       check_if_file_present
       # Do other stuff
    }
    
    actions #1st execution
    while [ current_time <= $cutoff ]; do
       actions # Loop execution
    done
    
  2. или:

    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