У меня ниже сценарий, как:
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-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
inotifywait
замену sleep
.
Если число не является переменной, вы можете использовать расширение скобки:
for i in {1..10} # you can also use {0..9}
do
whatever
done
Если счетчик является переменной, вы можете использовать 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
.