Я маю нижче такий сценарій, як:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Я маю нижче такий сценарій, як:
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, ви можете замінити 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
inotifywaitяк заміну для спаду sleep.
Якщо кількість не є змінною, ви можете використовувати розширення дужок:
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
$(seq $count)
n=0
until [ "$((n+=1))" -gt 10 ]
do <exists? command exit
done
echo oh noes!
хоча test -e file && exitє більш гнучким
exists1або такий файл , він все ще видає купу помилок, якщо / коли відповідний файл не знайдений. (Крім того, це помилки, якщо є декілька збігів.) Будь-яка інша оболонка, яку я протестував, здається, в будь-якому випадку дає помилки ...
done 2<>/dev/null. це bashробить сценарій? Я думав, що це лише випливає в -iнетерактивному контексті. все-таки exists?є стільки ж, скільки і назва наповнювача file. але так, я ненавиджу цитувати переспрямовування - якщо гвинти так сильно вгору.
test -e.