Qual é a melhor maneira de emular um loop do-while no Bash?
Eu poderia verificar a condição antes de entrar no while
loop e continuar verificando novamente a condição no loop, mas isso é código duplicado. Existe uma maneira mais limpa?
Pseudo código do meu script:
while [ current_time <= $cutoff ]; do
check_if_file_present
#do other stuff
done
Isso não funciona check_if_file_present
se lançado após o $cutoff
tempo, e um tempo de execução faria.
until
switch?until
também irá avaliar a condição antes de executar o corpo do loopRespostas:
Duas soluções simples:
Execute seu código uma vez antes do loop while
Ou:
fonte
:
é um interno, equivalente ao internotrue
. Ambos "não fazem nada com sucesso".true
é um programa real, enquanto:
está embutido. O primeiro simplesmente sai com0
(efalse
com1
) o último não faz absolutamente nada. Você pode verificar comwhich true
.:
ainda pode ser usado no lugar dotrue
Bash. Experimente comwhile :; do echo 1; done
.true
não é incorporado ao Bash. É um programa geralmente encontrado em/bin
.type true
no bash (todo o caminho de volta ao bash 3.2) retornatrue is a shell builtin
. É verdade que/bin/true
é um programa; o que não é verdade sobre a verdade é que issotrue
não é incorporado. (tl; dr: true é um bash embutido E um programa)Coloque o corpo do seu loop após
while
e antes do teste. O corpo real dowhile
loop deve ser não operacional.Em vez de dois pontos, você pode usar
continue
se achar mais legível. Você também pode inserir um comando que será executado apenas entre iterações (não antes da primeira ou depois da última), comoecho "Retrying in five seconds"; sleep 5
. Ou imprima delimitadores entre valores:Alterei o teste para usar parênteses duplos, já que você parece comparar números inteiros. Dentro de colchetes duplos, operadores de comparação como
<=
os lexicais e fornecerão o resultado errado ao comparar 2 e 10, por exemplo. Esses operadores não trabalham entre colchetes simples.fonte
while { check_if_file_present; ((current_time<=cutoff)); }; do :; done
? Ou seja, os comandos dentro dawhile
condição efetivamente separados por ponto-e-vírgula, não por exemplo&&
, e agrupados por{}
?&&
ou,||
pois isso os torna efetivamente parte do teste que controla owhile
. A menos que você esteja usando essa construção na linha de comando, eu não faria isso como uma linha (em um script, especificamente), pois a intenção é ilegível.while false; false; false; true; do echo here; break; done
outputs "here"Podemos emular um loop do-while no Bash com o
while [[condition]]; do true; done
seguinte:Por exemplo. Aqui está minha implementação sobre como obter conexão ssh no script bash:
Ele fornecerá a saída em sequência, como abaixo:
fonte