Come posso sostituire AND (&&) in un ciclo for?


24

Vorrei trovare un equivalente di

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

ma con comandi espressi in un forciclo come

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

Cosa suggeriresti di cambiare nella seconda espressione per trovare un equivalente della prima?

Risposte:


54

L'equivalente alla sequenza originale sarebbe:

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

La differenza con la risposta di Amit è che lo script non verrà chiuso, ovvero eseguirà potenziali comandi che potrebbero seguire la sequenza / il ciclo. Nota che lo stato di restituzione dell'intero loop sarà sempre vero con il mio suggerimento, questo potrebbe essere risolto se pertinente nel tuo caso.


1
D'accordo, questo segue più da vicino il comportamento dicmd && cmd
Amit Gold,


8

Puoi uscire dal circuito se uno di loro fallisce

for i in {1..55}; do
    if ! cmd $i; then
        exit 1
    fi
done

1
come ha notato @jiliagre (e ha fornito una correzione nella sua risposta), questo non "esce dal circuito", ma esce dalla shell chiamante.
Olivier Dulac,

1
Non è breaklegale lì? Sono abbastanza sicuro che l' ifaffermazione non interferisca ..
jpaugh

0

Questo è il modo in cui eseguo i miei compiti nel terminale senza usare &&

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

Simile a te devi inserire questo comando in uno script

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

Entrambi mi danno lo stesso risultato

google.com PING google.com (172.217.26.174) 56 (84) byte di dati. 64 byte da google.com (172.217.26.174): icmp_seq = 1 ttl = 56 time = 259 ms

--- statistiche ping google.com --- 1 pacchetti trasmessi, 1 ricevuto, 0% perdita pacchetti, 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) byte di dati. 64 byte da yahoo.com (98.138.253.109): icmp_seq = 1 ttl = 51 tempo = 398 ms

--- statistiche ping yahoo.com --- 1 pacchetti trasmessi, 1 ricevuto, 0% perdita pacchetti, tempo 0ms rtt min / avg / max / mdev = 398.974 / 398.974 / 398.974 / 0.000 ms

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.