Jak zamienić AND (&&) w pętli for?


24

Chciałbym znaleźć odpowiednik

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

ale z poleceniami wyrażonymi w forpętli jak

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

Co sugerujesz zmienić w drugim wyrażeniu, aby znaleźć odpowiednik pierwszego?

Odpowiedzi:


54

Odpowiednikiem oryginalnej sekwencji będzie:

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

Różnica w stosunku do odpowiedzi Amita polega na tym, że skrypt nie chce wyjść, tzn. Wykona potencjalne polecenia, które mogą podążać za sekwencją / pętlą. Zauważ, że zwracany status całej pętli zawsze będzie prawdziwy z moją sugestią, może to zostać naprawione, jeśli ma to zastosowanie w twoim przypadku.


1
Zgadzam się, że ściślej odpowiada to zachowaniucmd && cmd
Amit Gold

9

Jeśli chcesz brudnego rozwiązania jednowierszowego, możesz utworzyć polecenie i wysłać je do bash.

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

3
powinniśmy stworzyć IObashCC ^^
Olivier Dulac

8

Możesz wyjść z pętli, jeśli jeden z nich się nie powiedzie

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

1
jak zauważył @jiliagre (i podał poprawkę w swojej odpowiedzi), to nie „wychodzi z pętli”, wychodzi z powłoki wywołującej.
Olivier Dulac

1
Czy nie jest breaktam legalne? Jestem prawie pewien, że ifoświadczenie nie przeszkadza ...
jpaugh

0

W ten sposób wykonuję swoje zadania w terminalu bez użycia &&

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

Podobnie jak ty musisz umieścić to polecenie w skrypcie

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

Oba dają mi ten sam efekt

google.com PING google.com (172.217.26.174) 56 (84) bajtów danych. 64 bajty z google.com (172.217.26.174): icmp_seq = 1 ttl = 56 czas = 259 ms

--- statystyki ping google.com --- 1 przesłanych pakietów, 1 odebranych, 0% utraty pakietów, czas 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) bajtów danych. 64 bajty z yahoo.com (98.138.253.109): icmp_seq = 1 ttl = 51 czas = 398 ms

--- statystyki ping yahoo.com --- 1 przesłanych pakietów, 1 odebranych, 0% utraty pakietów, czas 0ms rtt min / avg / max / mdev = 398,974 / 398,9 974 / 398,974 / 0,000 ms

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.