Estou tendo problemas para encontrar a combinação certa de ponto e vírgula e / ou chaves. Eu gostaria de fazer isso, mas como uma linha da linha de comando:
while [ 1 ]
do
foo
sleep 2
done
Estou tendo problemas para encontrar a combinação certa de ponto e vírgula e / ou chaves. Eu gostaria de fazer isso, mas como uma linha da linha de comando:
while [ 1 ]
do
foo
sleep 2
done
Respostas:
while true; do foo; sleep 2; done
A propósito, se você digitar como uma multilinha (como está sendo exibida) no prompt de comando e chamar o histórico com a seta para cima, você o encontrará em uma única linha, corretamente pontuada.
$ while true
> do
> echo "hello"
> sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do echo "hello"; sleep 2; done
cmdhist
opção se você estiver usando o bash?
while true; do sh /Users/myuser/bin/vpn ; done
Também é possível usar o comando sleep na condição while. Fazendo uma linha parecer mais limpa.
while sleep 2; do echo thinking; done
while echo thinking ; do sleep 2 ; done
Claro, se o [enquanto] comando falhar, o loop termina, então você teria que while echo thinking || true ; do sleep 2 ; done
mas então você está de volta parawhile true ; ...
O cólon é sempre "verdadeiro":
while :; do foo; sleep 2; done
: [arguments]
Sem efeito; o comando não faz nada além de expandir argumentos e executar redirecionamentos especificados. Um código de saída zero é retornado.
Você pode usar ponto e vírgula para separar instruções:
$ while [ 1 ]; do foo; sleep 2; done
Você também pode fazer uso do until
comando:
until ((0)); do foo; sleep 2; done
Observe que, ao contrário de while
, until
executaria os comandos dentro do loop, desde que a condição de teste tenha um status de saída que não seja zero.
Usando um while
loop:
while read i; do foo; sleep 2; done < /dev/urandom
Usando um for
loop:
for ((;;)); do foo; sleep 2; done
Outra maneira de usar until
:
until [ ]; do foo; sleep 2; done
until ((0)); do foo; sleep 2; done
parece não funcionar. É infinito contínuo.
Gosto de usar o ponto-e-vírgula apenas para a instrução WHILE e o operador && para fazer o loop fazer mais de uma coisa ...
Então eu sempre faço assim
while true ; do echo Launching Spaceship into orbit && sleep 5s && /usr/bin/launch-mechanism && echo Launching in T-5 && sleep 1s && echo T-4 && sleep 1s && echo T-3 && sleep 1s && echo T-2 && sleep 1s && echo T-1 && sleep 1s && echo liftoff ; done
&&
no loop é o mesmo de qualquer outro momento, não é mesmo. Você precisa que a segunda coisa aconteça apenas se a primeira acontecer, e use &&
outra coisa ;
é suficiente. Realmente, você deseja manter o conteúdo desse loop curto e simples, idealmente apenas um comando, para uma função ou um script.
Para uso simples processo de observação watch
, em vez
Usando while
:
while true; do echo 'while'; sleep 2s; done
Usando for
Loop:
for ((;;)); do echo 'forloop'; sleep 2; done
Usando Recursion
(um pouco diferente do anterior, a interrupção do teclado não o interrompe)
list(){ echo 'recursion'; sleep 2; list; } && list;
Se você deseja que o loop while pare após alguma condição e seu foo
comando retorne diferente de zero quando essa condição for atendida, você poderá fazer com que o loop quebre assim:
while foo; do echo 'sleeping...'; sleep 5; done;
Por exemplo, se o foo
comando estiver excluindo itens em lotes e retornará 1 quando não houver mais nada a ser excluído.
Isso funciona bem se você tiver um script personalizado que precise executar um comando várias vezes até alguma condição. Você escreve o script para sair 1
quando a condição for atendida e sair 0
quando deve ser executado novamente.
Por exemplo, digamos que você tenha um script python batch_update.py
que atualize 100 linhas em um banco de dados e retorne 0
se houver mais a atualizar e 1
se não houver mais. O comando a seguir permitirá que você atualize as linhas 100 por vez, com suspensão por 5 segundos entre as atualizações:
while batch_update.py; do echo 'sleeping...'; sleep 5; done;
foo
comando sair com código 1
quando deseja que o loop while seja interrompido. Atualizei minha resposta com um exemplo.
Se eu posso dar dois exemplos práticos (com um pouco de "emoção").
Isso grava o nome de todos os arquivos terminados com ".jpg" na pasta "img":
for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; done
Isso os exclui:
for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done
Apenas tentando contribuir.
ls -1 *.jpg
erm *.jpg
Você pode tentar isso também AVISO: isso você não deve fazer, mas como a pergunta está pedindo um loop infinito sem fim ... é assim que você poderia fazê-lo.
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done