Como faço para substituir AND (&&) em um loop for?

23

Eu gostaria de encontrar um equivalente de

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

mas com comandos expressos em um loop for como

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

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

    
por user123456 23.10.2016 / 07:35

4 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 da Amit é que o script não sai, ou seja, executará comandos potenciais 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 for relevante no seu caso.

    
por 23.10.2016 / 10:01
9

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

echo "cmd "{1..20}" &&" : | bash
    
por 24.10.2016 / 13:30
8

Você pode sair do loop se um deles falhar

for i in {1..55}; do
    if ! cmd $i; then
        exit 1
    fi
done
    
por 23.10.2016 / 09:18
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ê tem que colocar este 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 of data. 64 bytes from google.com (172.217.26.174): icmp_seq=1 ttl=56 time=259 ms

--- google.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 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 of data. 64 bytes from yahoo.com (98.138.253.109): icmp_seq=1 ttl=51 time=398 ms

--- yahoo.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 398.974/398.974/398.974/0.000 ms

    
por 31.10.2016 / 07:18