Eu tenho abaixo cenário como:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Eu tenho abaixo cenário como:
if [file exists]; then
exit
elif
recheck if file exist (max 10 times)
if found exit else recheck again as per counter
fi
Respostas:
Existem muitas maneiras de fazer esse loop.
Com ksh93
sintaxe (também suportada por zsh
e bash
):
for (( i=0; i<10; ++i)); do
[ -e filename ] && break
sleep 10
done
Para qualquer shell semelhante ao POSIX:
n=0
while [ "$n" -lt 10 ] && [ ! -e filename ]; do
n=$(( n + 1 ))
sleep 10
done
Ambos os loops dormem 10 segundos em cada iteração antes de testar a existência do arquivo novamente.
Após a conclusão do loop, você terá que testar a existência do arquivo pela última vez para descobrir se o loop saiu devido à execução 10 vezes ou devido à exibição do arquivo.
Se desejar, e se você tiver acesso às ferramentas inotify, poderá substituir a sleep 10
chamada por
inotifywait -q -t 10 -e create ./ >/dev/null
Isso aguardaria a ocorrência de um evento de criação de arquivo no diretório atual, mas atingia o tempo limite após 10 segundos. Dessa forma, seu loop sairá assim que o nome do arquivo especificado aparecer (se ele aparecer).
O código completo, com inotifywait
(substitua por, sleep 10
se você não quiser isso), pode parecer
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
como um substituto para sleep
.
Se a contagem não for uma variável, você poderá usar a expansão entre chaves:
for i in {1..10} # you can also use {0..9}
do
whatever
done
Se a contagem for uma variável, você pode usar o seq
comando:
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!
embora test -e file && exit
seja mais flexível
exists1
esse, ele ainda imprime vários erros se / quando um arquivo correspondente não for encontrado. (Também erros se houver várias correspondências.) Qualquer outra shell Testei parece dar erros em qualquer caso ...
done 2<>/dev/null
. faz bash
isso com script? eu pensei que isso só acontecia em um -i
contexto não-ativo . ainda, exists?
é tanto quanto um nome de preenchimento como file
. Mas sim, eu odeio citar em redirecionamentos - se parafusos de modo muito para cima.
test -e
.