ฉันจะแทนที่ AND (&&) ในวง for ได้อย่างไร


24

ฉันต้องการหาสิ่งที่เทียบเท่า

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

แต่มีคำสั่งแสดงอยู่ภายในforลูปเช่น

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

คุณอยากแนะนำอะไรให้เปลี่ยนในนิพจน์ที่สองเพื่อหาค่าที่เท่ากัน

คำตอบ:


54

เทียบเท่ากับลำดับเดิมของคุณจะเป็น:

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

ความแตกต่างกับคำตอบของ Amit คือสคริปต์จะไม่ออกเช่นจะรันคำสั่งที่อาจเกิดขึ้นซึ่งอาจเป็นไปตามลำดับ / ลูป โปรดทราบว่าสถานะการส่งคืนของลูปทั้งหมดจะเป็นจริงเสมอกับคำแนะนำของฉันซึ่งอาจได้รับการแก้ไขหากเกี่ยวข้องในกรณีของคุณ


1
เห็นด้วยอย่างนี้จะติดตามพฤติกรรมของcmd && cmd
Amit Gold

9

หากคุณต้องการโซลูชันบรรทัดเดียวที่สกปรกคุณสามารถสร้างคำสั่งและส่งไปยัง bash

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

3
เราควรสร้าง IObashCC ^^
Olivier Dulac

8

คุณสามารถแยกวงออกได้ถ้าหนึ่งในนั้นล้มเหลว

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

1
เช่น @jiliagre ตั้งข้อสังเกต (และให้การแก้ไขในคำตอบของเขา) นี้ไม่ได้ "แยกออกจากวง" มันออกจากเปลือกเรียก
Olivier Dulac

1
ไม่breakถูกกฎหมายใช่ไหม ฉันค่อนข้างมั่นใจว่าifข้อความจะไม่รบกวน ..
jpaugh

0

นี่คือวิธีที่ฉันทำงานของฉันใน terminal โดยไม่ต้องใช้ &&

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

คล้ายกับที่คุณต้องใส่คำสั่งนี้ในสคริปต์

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

ทั้งสองให้ผลลัพธ์เดียวกันกับฉัน

google.com PING google.com (172.217.26.174) 56 (84) ไบต์ของข้อมูล 64 ไบต์จาก google.com (172.217.26.174): icmp_seq = 1 ttl = 56 time = 259 ms

--- สถิติ google ping --- 1 แพ็คเก็ตที่ส่ง, 1 ที่ได้รับ, 0% การสูญเสียแพ็กเก็ต, เวลา 0ms rtt นาที / เฉลี่ย / สูงสุด / mdev = 259.794 / 259.794 / 259.794 / 0.000 ms yahoo.com PING yahoo.com ( 98.138.253.109) 56 (84) ไบต์ของข้อมูล 64 ไบต์จาก yahoo.com (98.138.253.109): icmp_seq = 1 ttl = 51 เวลา = 398 ms

--- yahoo.com ping สถิติ --- 1 แพ็คเก็ตที่ส่ง, 1 ที่ได้รับ, 0% การสูญเสียแพ็กเก็ต, เวลา 0ms rtt นาที / avg / max / mdev = 398.974 / 398.974 / 398.974 / 0.000 ms

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.