Comment remplacer AND (&&) dans une boucle for?


24

J'aimerais trouver un équivalent de

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

mais avec des commandes exprimées dans une forboucle comme

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

Que suggéreriez-vous de changer dans la deuxième expression pour trouver un équivalent de la première?

Réponses:


54

L'équivalent de votre séquence d'origine serait:

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

La différence avec la réponse d'Amit est que le script ne se fermera pas, c'est-à-dire qu'il exécutera des commandes potentielles qui pourraient suivre la séquence / boucle. Notez que le statut de retour de la boucle entière sera toujours vrai avec ma suggestion, cela peut être corrigé si cela est pertinent dans votre cas.


1
D'accord, cela suit de plus près le comportement decmd && cmd
Amit Gold

9

Si vous voulez une solution une ligne sale, vous pouvez créer une commande et l'envoyer à bash.

echo "cmd "{1..20}" &&" : | bash

3
nous devons créer un IObashCC ^^
Olivier Dulac

8

Vous pouvez sortir de la boucle si l'un d'eux échoue

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

1
comme @jiliagre l'a noté (et a apporté une correction dans sa réponse), cela ne "sort pas de la boucle", il quitte le shell appelant.
Olivier Dulac

1
N'est-ce pas breaklégal là-bas? Je suis sûr que la ifdéclaration n'interfère pas ..
jpaugh

0

Voici comment j'exécute mes tâches dans le terminal sans utiliser &&

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

Similaire à vous devez mettre cette commande dans un script

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

Les deux me donnent la même sortie

google.com PING google.com (172.217.26.174) 56 (84) octets de données. 64 octets de google.com (172.217.26.174): icmp_seq = 1 ttl = 56 time = 259 ms

--- statistiques ping google.com --- 1 paquets transmis, 1 reçu, 0% de perte de paquets, temps 0 ms rtt min / moy / max / mdev = 259,794 / 259,794 / 259,794 / 0,000 ms yahoo.com PING yahoo.com ( 98.138.253.109) 56 (84) octets de données. 64 octets de yahoo.com (98.138.253.109): icmp_seq = 1 ttl = 51 time = 398 ms

--- Statistiques ping yahoo.com --- 1 paquets transmis, 1 reçu, 0% de perte de paquets, temps 0 ms rtt min / moy / max / mdev = 398,974 / 398,974 / 398,974 / 0,000 ms

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.