Wie ersetze ich UND (&&) in einer for-Schleife?

24

Ich würde gerne ein Äquivalent von finden

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

aber mit Befehlen innerhalb einer forSchleife ausgedrückt wie

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

Was würden Sie vorschlagen, um im zweiten Ausdruck ein Äquivalent zum ersten zu finden?

user123456
quelle

Antworten:

54

Das Äquivalent zu Ihrer ursprünglichen Sequenz wäre:

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

Der Unterschied zu Amits Antwort besteht darin, dass das Skript nicht beendet wird, dh potenzielle Befehle ausführt, die der Sequenz / Schleife folgen könnten. Beachten Sie, dass der Rückgabestatus der gesamten Schleife nach meinem Vorschlag immer wahr ist. Dies kann ggf. in Ihrem Fall behoben werden.

jlliagre
quelle
1
Einverstanden, folgt dies genauer dem Verhalten voncmd && cmd
Amit Gold
9

Wenn Sie eine schmutzige einzeilige Lösung wünschen, können Sie einen Befehl erstellen und ihn an bash senden.

echo "cmd "{1..20}" &&" : | bash
Tomáš Nesrovnal
quelle
3
wir sollten ein IObashCC erstellen ^^
Olivier Dulac
8

Sie können aus der Schleife ausbrechen, wenn einer von ihnen fehlgeschlagen ist

for i in {1..55}; do
    if ! cmd $i; then
        exit 1
    fi
done
Amit Gold
quelle
1
Wie @jiliagre bemerkte (und in seiner Antwort eine Korrektur vorsah), "bricht dies nicht aus der Schleife aus", sondern verlässt die aufrufende Shell.
Olivier Dulac
1
Ist da nicht breaklegal? Ich bin mir ziemlich sicher, dass die ifAussage nicht stört.
Jpaugh
0

So führe ich meine Aufgaben im Terminal aus, ohne sie zu benutzen &&

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

Ähnlich wie Sie müssen diesen Befehl in ein Skript einfügen

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

Beide geben mir die gleiche Ausgabe

google.com PING google.com (172.217.26.174) 56 (84) Datenbytes. 64 Bytes von google.com (172.217.26.174): icmp_seq = 1 ttl = 56 time = 259 ms

--- google.com ping statistics --- 1 Pakete gesendet, 1 empfangen, 0% Paketverlust, Zeit 0 ms 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) Datenbytes. 64 Bytes von yahoo.com (98.138.253.109): icmp_seq = 1 ttl = 51 time = 398 ms

--- yahoo.com ping statistics --- 1 Pakete gesendet, 1 empfangen, 0% Paketverlust, Zeit 0 ms rtt min / avg / max / mdev = 398.974 / 398.974 / 398.974 / 0.000 ms

SuperKrish
quelle