Bagaimana cara saya mengganti AND (&&) dalam for for?

24

Saya ingin menemukan yang setara

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

tetapi dengan perintah yang diekspresikan dalam satu forlingkaran seperti

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

Apa yang akan Anda sarankan untuk berubah dalam ekspresi kedua untuk menemukan yang setara dengan yang pertama?

pengguna123456
sumber

Jawaban:

54

Setara dengan urutan asli Anda adalah:

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

Perbedaannya dengan jawaban Amit adalah skrip tidak akan keluar, yaitu akan mengeksekusi perintah potensial yang mungkin mengikuti urutan / loop. Perhatikan bahwa status pengembalian seluruh loop akan selalu benar dengan saran saya, ini mungkin diperbaiki jika relevan dalam kasus Anda.

Jlliagre
sumber
1
Setuju, ini lebih dekat mengikuti perilakucmd && cmd
Amit Gold
9

Jika Anda menginginkan solusi satu baris yang kotor, Anda dapat membuat perintah dan mengirimkannya ke bash.

echo "cmd "{1..20}" &&" : | bash
Tomáš Nesrovnal
sumber
3
kita harus membuat IObashCC ^^
Olivier Dulac
8

Anda dapat keluar dari loop jika salah satunya gagal

for i in {1..55}; do
    if ! cmd $i; then
        exit 1
    fi
done
Amit Gold
sumber
1
seperti @ jiliagre dicatat (dan memberikan koreksi dalam jawabannya), ini tidak "keluar dari lingkaran", itu keluar dari shell panggilan.
Olivier Dulac
1
Tidak breaklegal di sana? Saya cukup yakin ifpernyataan itu tidak mengganggu ..
jpaugh
0

Ini adalah bagaimana saya menjalankan tugas saya di terminal tanpa menggunakan &&

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

Mirip dengan Anda harus meletakkan perintah ini dalam skrip

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

Keduanya memberikan hasil yang sama kepada saya

google.com PING google.com (172.217.26.174) 56 (84) byte data. 64 byte dari google.com (172.217.26.174): icmp_seq = 1 ttl = 56 waktu = 259 ms

--- statistik ping google.com --- 1 paket dikirimkan, 1 diterima, kehilangan paket 0%, waktu 0ms rtt min / avg / max / mdev = 259.794 / 259.794 / 259.794 / 259.794 / 0.000 ms yahoo.com PING yahoo.com ( 98.138.253.109) 56 (84) byte data. 64 byte dari yahoo.com (98.138.253.109): icmp_seq = 1 ttl = 51 waktu = 398 ms

--- statistik ping yahoo.com --- 1 paket dikirimkan, 1 diterima, kehilangan paket 0%, waktu 0ms rtt min / avg / max / mdev = 398.974 / 398.974 / 398.974 / 398.974 / 0.000 ms

SuperKrish
sumber