ฉันเคยเขียนสคริปต์ของฉันเช่นนี้:
some_command
while [ $? -ne 0 ] ; do
sleep 1
some_command
done
มันทำให้ฉันรำคาญอยู่เสมอว่าฉันต้องเขียนsome_command
สองครั้ง ฉันสามารถวางมันไว้ในส่วนการทดสอบลูปได้ไหม?
ฉันเคยเขียนสคริปต์ของฉันเช่นนี้:
some_command
while [ $? -ne 0 ] ; do
sleep 1
some_command
done
มันทำให้ฉันรำคาญอยู่เสมอว่าฉันต้องเขียนsome_command
สองครั้ง ฉันสามารถวางมันไว้ในส่วนการทดสอบลูปได้ไหม?
คำตอบ:
คุณสามารถใช้some_command
เป็นเงื่อนไขการทดสอบของคุณ
while ! some_command; do sleep 1; done
เงื่อนไขจะยังคงเป็นจริงตราบใดที่some_command
มีข้อผิดพลาด
หรือวิธีการ verbose เพิ่มเติมถ้าคุณต้องการทำการตรวจสอบเพิ่มเติม:
while ! some_command
do
# add more if desired
sleep 1
done
while ! some_command; do several; commands; sleep 1; done
นี่คือสิ่งที่until
ลูปมีไว้สำหรับ:
until some_command
do sleep 1
done
มันเป็นการลบล้างตรรกะของwhile
วง
until
ห่วงuntil
ห่วงอย่างต่อเนื่องจะต้องดำเนินการอย่างใดอย่างหนึ่งสารประกอบรายการตราบเท่าที่อื่นสารประกอบรายการมีสถานะทางออกที่ไม่ใช่ศูนย์
รูปแบบของการวนซ้ำจนกว่าจะเป็นดังนี้:
จนกระทั่ง compound-list-1 ทำ compound-list-2 เสร็จแล้ว
until
คำสั่งเสร็จสมบูรณ์ มิฉะนั้นจะต้องดำเนินการcompound-list-2และกระบวนการจะทำซ้ำคุณสามารถทำได้:
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
[
และ]
รอบคำสั่ง
ทั้ง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
จะดำเนินการเฉพาะในกรณีที่คำสั่งล้มเหลว)