ฉันจะรันคำสั่งและรับรหัสการออกโดยใช้อักขระน้อยลงได้อย่างไร


13

ฉันเคยเขียนสคริปต์ของฉันเช่นนี้:

some_command
while [ $? -ne 0 ] ; do
    sleep 1
    some_command
done

มันทำให้ฉันรำคาญอยู่เสมอว่าฉันต้องเขียนsome_commandสองครั้ง ฉันสามารถวางมันไว้ในส่วนการทดสอบลูปได้ไหม?

คำตอบ:


20

คุณสามารถใช้some_commandเป็นเงื่อนไขการทดสอบของคุณ

while ! some_command; do sleep 1; done

เงื่อนไขจะยังคงเป็นจริงตราบใดที่some_commandมีข้อผิดพลาด

หรือวิธีการ verbose เพิ่มเติมถ้าคุณต้องการทำการตรวจสอบเพิ่มเติม:

while ! some_command
do 
    # add more if desired
    sleep 1
done

สิ่งนี้ดูดีกว่าของฉันแม้ว่าจะเป็นหนึ่งซับ ;-)
Anthon

OP อาจต้องการแยกออกเป็นหลายบรรทัดหากเขาจำเป็นต้องดำเนินการหลาย ๆ คำสั่งเมื่อล้มเหลว :)
John WH Smith

ไม่มีเหตุผลใดที่คุณไม่สามารถแบ่งบรรทัดที่เซมิโคลอนเพื่อให้เป็นหลายบรรทัดได้
Mark Stewart

1
... หรือเขียนwhile ! some_command; do several; commands; sleep 1; done
Ignis

12

นี่คือสิ่งที่untilลูปมีไว้สำหรับ:

until some_command
do    sleep 1
done

มันเป็นการลบล้างตรรกะของwhileวง

ข้อมูลจำเพาะพูดว่า:

untilห่วง

  • untilห่วงอย่างต่อเนื่องจะต้องดำเนินการอย่างใดอย่างหนึ่งสารประกอบรายการตราบเท่าที่อื่นสารประกอบรายการมีสถานะทางออกที่ไม่ใช่ศูนย์

  • รูปแบบของการวนซ้ำจนกว่าจะเป็นดังนี้:

    จนกระทั่ง compound-list-1
    ทำ compound-list-2
    เสร็จแล้ว
  • สารประกอบรายการ-1จะต้องดำเนินการและถ้ามันมีสถานะออกศูนย์ที่untilคำสั่งเสร็จสมบูรณ์ มิฉะนั้นจะต้องดำเนินการcompound-list-2และกระบวนการจะทำซ้ำ

4

คุณสามารถทำได้:

false
while [ $? -ne 0 ] ; do
   sleep 1
   some_command
done

สิ่งนี้มีข้อเสียแม้ว่ามันจะนอนหนึ่งวินาทีก่อนเสมอ

หากคุณต้องการที่จะออกจากคำสั่งใด ๆ เพื่อออกด้วย 0 คุณสามารถทำได้:

while true; do
  if [ some_command ] ; then break ; fi
  if [ some_other_command ] ; then break ; fi
  sleep 1
done

ซึ่งแน่นอนว่าใช้งานได้เพียง some_command


5
ตัวอย่างที่สองไม่ควรรวม[และ]รอบคำสั่ง
nyuszika7h

2

ทั้งwhile ! ...มิได้until ...ทำงานบนระบบที่แข็งสภาพแวดล้อมเปลือกของพวกเขาก่อนที่จะ POSIX.1-2001 อย่างไรก็ตามสิ่งนี้ทำ

while :; do
    if some command; then
        break
    fi
    sleep 1
done

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

sleep 1 while 0 != system qw(some command);

(ดังกล่าวข้างต้นsleepจะดำเนินการเฉพาะในกรณีที่คำสั่งล้มเหลว)

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