Каков наилучший способ эмулировать цикл выполнения в Bash?
Я мог бы проверить условие перед входом в while
цикл, а затем продолжить повторную проверку условия в цикле, но это дублированный код. Есть ли более чистый способ?
Псевдокод моего скрипта:
while [ current_time <= $cutoff ]; do
check_if_file_present
#do other stuff
done
Это не сработает, check_if_file_present
если запустится через $cutoff
некоторое время, и сделаем так, как хотелось бы.
until
выключатель?until
также оценит условие перед выполнением тела циклаОтветы:
Два простых решения:
Выполните ваш код один раз перед циклом while
Или:
источник
:
является встроенным, эквивалентным встроенномуtrue
. Они оба "ничего не делают успешно".true
это актуальная программа, тогда:
как встроенная. Первый просто выходит с0
(иfalse
с1
), последний ничего не делает. Вы можете проверить сwhich true
.:
все еще можно использовать вместоtrue
Bash. Попробуйте это сwhile :; do echo 1; done
.true
не встроено в Bash. Эта программа обычно находится в/bin
.type true
в bash (вплоть до bash 3.2) возвращаетсяtrue is a shell builtin
. Это правда, что/bin/true
это программа; что неправда в истине, так это то, чтоtrue
она не является встроенной. (tl; dr: true - встроенная программа bash и программа)Поместите тело вашей петли после
while
и до теста. Фактическое телоwhile
цикла должно быть неактивным.Вместо двоеточия вы можете использовать его,
continue
если найдете его более читабельным. Вы также можете вставить команду, которая будет выполняться только между итерациями (не до первой или после последней), напримерecho "Retrying in five seconds"; sleep 5
. Или выведите разделители между значениями:Я изменил тест, чтобы использовать двойные скобки, так как вы, кажется, сравниваете целые числа. Внутри двойных квадратных скобок операторы сравнения, такие как
<=
лексические, дадут неправильный результат, например, при сравнении 2 и 10. Эти операторы не работают в квадратных скобках.источник
while { check_if_file_present; ((current_time<=cutoff)); }; do :; done
? Т.е. команды внутриwhile
условия эффективно разделены точками с запятой, а не, например&&
, и сгруппированы{}
?&&
или||
потому что это делает их частью теста, который контролируетwhile
. Если вы не используете эту конструкцию в командной строке, я бы не стал использовать ее как однострочную (особенно в сценарии), поскольку намерение не читается.while false; false; false; true; do echo here; break; done
Вывод «здесь»Мы можем эмулировать цикл do-while в Bash
while [[condition]]; do true; done
следующим образом:Для примера. Вот моя реализация получения ssh-соединения в bash-скрипте:
Это даст вывод в последовательности, как показано ниже:
источник