Làm cách nào để thay thế AND (&&) trong vòng lặp for?


24

Tôi muốn tìm một tương đương với

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

nhưng với các lệnh được thể hiện trong một forvòng lặp như

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

Những gì bạn sẽ đề nghị thay đổi trong biểu thức thứ hai để tìm một tương đương với biểu thức thứ nhất?

Câu trả lời:


54

Tương đương với trình tự ban đầu của bạn sẽ là:

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

Sự khác biệt với câu trả lời của Amit là tập lệnh sẽ không thoát, tức là sẽ thực thi các lệnh tiềm năng có thể tuân theo chuỗi / vòng lặp. Lưu ý rằng trạng thái trả về của toàn bộ vòng lặp sẽ luôn đúng với đề xuất của tôi, điều này có thể được khắc phục nếu có liên quan trong trường hợp của bạn.


1
Đồng ý, điều này theo sát hơn hành vi củacmd && cmd
Amit Gold

9

Nếu bạn muốn một giải pháp một dòng bẩn, bạn có thể tạo một lệnh và gửi nó đến bash.

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

3
chúng ta nên tạo IObashCC ^^
Olivier Dulac

8

Bạn có thể thoát ra khỏi vòng lặp nếu một trong số họ thất bại

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

1
như @jiliagre đã lưu ý (và cung cấp một sự điều chỉnh trong câu trả lời của anh ấy), điều này không "thoát ra khỏi vòng lặp", nó thoát khỏi vỏ gọi.
Olivier Dulac

1
Không breakhợp pháp ở đó à? Tôi khá chắc chắn rằng iftuyên bố không can thiệp ..
jpaugh

0

Đây là cách tôi thực hiện các nhiệm vụ của mình trong thiết bị đầu cuối mà không sử dụng &&

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

Tương tự như bạn phải đặt lệnh này trong một kịch bản

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

Cả hai đều cho cùng một đầu ra

google.com PING google.com (172.217.26.174) 56 (84) byte dữ liệu. 64 byte từ google.com (172.217.26.174): icmp_seq = 1 ttl = 56 time = 259 ms

--- thống kê ping của google.com --- 1 gói được truyền, 1 đã nhận, mất 0% gói, thời gian 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 dữ liệu. 64 byte từ yahoo.com (98.138.253.109): icmp_seq = 1 ttl = 51 time = 398 ms

--- yahoo.com thống kê ping --- 1 gói được truyền, 1 nhận, mất 0% gói, thời gian 0ms rtt min / avg / max / mdev = 398.974 / 398.974 / 398.974 / 0.000 ms

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.