Como substituo AND (&&) em um loop for?

24

Eu gostaria de encontrar um equivalente a

cmd 1 && cmd 2 && ... && cmd 20

mas com comandos expressos em um forloop como

for i in {1..20}
do
   cmd $i
done

O que você sugeriria mudar na segunda expressão para encontrar um equivalente à primeira?

user123456
fonte

Respostas:

54

O equivalente à sua sequência original seria:

for i in {1..20}
do
   cmd $i || break
done

A diferença com a resposta de Amit é que o script não sai, ou seja, executa comandos em potencial que podem seguir a sequência / loop. Observe que o status de retorno de todo o loop sempre será verdadeiro com a minha sugestão; isso pode ser corrigido se relevante no seu caso.

jlliagre
fonte
11
Acordado, este segue mais de perto o comportamento decmd && cmd
Amit ouro
9

Se você deseja uma solução de linha única suja, pode criar um comando e enviá-lo para o bash.

echo "cmd "{1..20}" &&" : | bash
Tomáš Nesrovnal
fonte
3
devemos criar um IObashCC ^^
Olivier Dulac
8

Você pode sair do loop se um deles falhar

for i in {1..55}; do
    if ! cmd $i; then
        exit 1
    fi
done
Amit Gold
fonte
11
como observou @jiliagre (e forneceu uma correção em sua resposta), isso não "sai do circuito", sai do shell de chamada.
Olivier Dulac
11
Não é breaklegal lá? Eu tenho certeza que a ifdeclaração não interfere ..
jpaugh
0

É assim que executo minhas tarefas no terminal sem usar &&

 for i in google.com yahoo.com;do ping -c1 $i;echo $i;done

Semelhante a você ter que colocar esse comando em um script

 for i in google.com yahoo.com
    do echo $i;ping -c1 $i;
  done

Ambos dando a mesma saída para mim

google.com PING google.com (172.217.26.174) 56 (84) bytes de dados. 64 bytes de google.com (172.217.26.174): icmp_seq = 1 ttl = 56 time = 259 ms

--- estatísticas de ping do google.com --- 1 pacote transmitido, 1 recebido, 0% de perda de pacote, tempo 0ms rtt min / avg / max / mdev = 259.794 / 259.794 / 259.794 / 0.000 ms yahoo.com PING yahoo.com 98.138.253.109) 56 (84) bytes de dados. 64 bytes de yahoo.com (98.138.253.109): icmp_seq = 1 ttl = 51 time = 398 ms

--- yahoo.com estatísticas de ping --- 1 pacotes transmitidos, 1 recebido, 0% de perda de pacotes, tempo 0ms rtt min / avg / max / mdev = 398.974 / 398.974 / 398.974 / 0.000 ms

SuperKrish
fonte