Como repetir o loop n vezes no Bash

6

Eu tenho um cenário abaixo como:

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

qualquer ajuda seria útil

    
por Rocky86 05.08.2018 / 08:31

3 respostas

7

Existem várias maneiras de fazer esse loop.

Com a sintaxe ksh93 (também suportada por zsh e bash ):

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

Para qualquer shell do tipo 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 o término do loop, você terá que testar a existência do arquivo pela última vez para descobrir se o loop foi encerrado devido à execução 10 vezes ou devido ao aparecimento do arquivo.

Se desejar, e se você tiver acesso a inotify-tools, poderá substituir a chamada sleep 10 por

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

Isso aguardaria a ocorrência de um evento de criação de arquivos no diretório atual, mas expiraria após 10 segundos. Dessa forma, seu loop sairia assim que o nome do arquivo aparecesse (se aparecesse).

O código completo, com inotifywait (substitua por sleep 10 se você não quiser), 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
    
por 05.08.2018 / 08:37
2

Se a contagem não for uma variável, você pode usar a expansão de 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 comando seq :

count=10
for i in $(seq $count)
do
  whatever
done
    
por 05.08.2018 / 08:47
0
n=0
until [ "$((n+=1))" -gt 10 ]
do    <exists? command exit
done
echo oh noes!

embora test -e file && exit seja mais flexível

    
por 05.08.2018 / 08:36