Intereting Posts
Какой метод Linux Mint Timeshift более экономичен Используйте зарезервированное слово оболочки, если оно скрыто псевдонимом Telnet через Ethernet для Linux? SSH дважды и запустить команду, экранируя символ? Я хотел бы поместить один единственный значок на Рабочий стол, который фактически открывает Рабочий стол. Есть идеи? Ansible: Как разобрать источник инвентаря Какие журналы будут записаны, если файловая система заполнена в UNIX? Рекомендация для пула накопителей usb find внутри backticks не распознается внутри сценария оболочки запустить FreeBSD 10 (в качестве гостя) под Xen на Linux Как предотвратить передачу прерывания клавиатуры через программу Screen Уменьшить блокировку диска io с помощью многих устройств? Как проверить, что AES-NI поддерживается моим процессором? Не удается прочитать прежнюю внутреннюю файловую систему hdd через usb (конфликт имен группы томов fedora) Выполнить две команды, основанные на выходе первого

Как повторить цикл n раз в Bash

У меня ниже сценарий, как:

if [file exists]; then exit elif recheck if file exist (max 10 times) if found exit else recheck again as per counter fi 

Есть много способов сделать этот цикл.

С синтаксисом ksh93 (также поддерживается zsh и bash ):

 for (( i=0; i<10; ++i)); do [ -e filename ] && break sleep 10 done 

Для любой POSIX-подобной оболочки:

 n=0 while [ "$n" -lt 10 ] && [ ! -e filename ]; do n=$(( n + 1 )) sleep 10 done 

Оба цикла спят по 10 секунд в каждой итерации, прежде чем снова проверять наличие файла.

После завершения цикла вам придется в последний раз проверить наличие файла, чтобы выяснить, завершился ли цикл из-за 10-кратного выполнения или из-за появления файла.

Если вы хотите, и если у вас есть доступ к inotify-tools, вы можете заменить вызов sleep 10 на

 inotifywait -q -t 10 -e create ./ >/dev/null 

Это приведет к ожиданию события создания файла в текущем каталоге, но истечет время ожидания через 10 секунд. Таким образом, ваш цикл завершится, как только появится указанное имя файла (если оно появилось).

Полный код с inotifywait (замените на sleep 10 если вы этого не хотите) может выглядеть так

 for (( i=0; i<10; ++i)); do [ -e filename ] && break inotifywait -q -t 10 -e create ./ >/dev/null done if [ -e filename ]; then echo 'file appeared!' else echo 'file did not turn up in time' fi 

Если число не является переменной, вы можете использовать расширение скобки:

 for i in {1..10} # you can also use {0..9} do whatever done 

Если count является переменной, вы можете использовать команду seq :

 count=10 for i in $(seq $count) do whatever done 
 n=0 until [ "$((n+=1))" -gt 10 ] do  

хотя test -e file && exit более гибкий