“ ในขณะที่:;” หมายถึงอะไร


27

ฉันรู้ว่าwhileวงคืออะไร อย่างไรก็ตามฉันเพิ่งเห็นว่าทำงานกับ:

while [condition]
while ![condition]
while TRUE (infinite loop)

ในกรณีที่คำสั่งหลังจากที่whileจะต้องมีอย่างใดอย่างหนึ่งหรือTRUEFALSE

มีคำสั่งเชลล์ builtin :ชื่อเป็น มันอธิบายเป็นคำสั่งหุ่นทำอะไร แต่ผมไม่ทราบว่ามันจะเหมือนกันที่นี่แม้ว่าจะสามารถหรือTRUE FALSEอาจจะเป็นสิ่งที่แตกต่างกัน แต่อะไรนะ?


4
คำสั่ง:ไม่ทำอะไรเลย แต่มักจะออกด้วยรหัสส่งคืน 0 ดังนั้นจึงเป็นเช่นเดียวกันคือwhile true(สมมติว่าระบบของคุณมีการtrueปฏิบัติการ)
John1024

@ John1024 มันจะคืนค่าศูนย์เว้นแต่การประเมินข้อโต้แย้งจะทำให้เกิดข้อผิดพลาดตัวอย่างเช่นการกำหนดค่าให้กับตัวแปรแบบอ่านอย่างเดียว
Kusalananda

3
@ Kusalananda ใช่ถ้า:คำสั่งไม่เคยถูกดำเนินการมันจะไม่ส่งคืน 0 นั่นคือความคิดที่มากเกินไปในความคิดของฉัน
hvd

คำตอบ:


50

ไวยากรณ์คือ:

while
  first list of commands
do
  second list of commands
done

ซึ่งรันรายการคำสั่งที่สองในลูปตราบใดที่รายการคำสั่งแรก (ดังนั้นการรันครั้งสุดท้ายในรายการนั้น) จะสำเร็จ

ในรายการคำสั่งแรกนั้นคุณสามารถใช้[คำสั่งเพื่อทำการทดสอบชนิดต่าง ๆ หรือคุณสามารถใช้:คำสั่ง null ที่ไม่ทำอะไรเลยและส่งคืนความสำเร็จหรือคำสั่งอื่น ๆ

while :; do cmd; done

ทำงานcmdซ้ำแล้วซ้ำอีกเป็น:ผลตอบแทนที่ประสบความสำเร็จ นั่นคือการวนซ้ำตลอดไป คุณสามารถใช้trueคำสั่งแทนเพื่อให้อ่านง่ายขึ้น:

while true; do cmd; done

ผู้คนเคยชอบ:ที่:จะถูกสร้างขึ้นมาเสมอในขณะที่trueไม่ใช่ (เมื่อนานมาแล้วหอยส่วนใหญ่มีอยู่แล้วtrueในปัจจุบัน) ¹

ตัวแปรอื่น ๆ ที่คุณอาจเห็น:

while [ 1 ];  do cmd; done

ด้านบนเรากำลังเรียก[คำสั่งเพื่อทดสอบว่าสตริง "1" ไม่ว่างเปล่า (จริงเสมอเช่นกัน)

while ((1)); do cmd; done

การใช้((...))ไวยากรณ์Korn / bash / zsh เพื่อเลียนแบบwhile(1) { ...; }ของ C

หรือคนที่ซับซ้อนมากขึ้นชอบuntil false; do cmd; done, until ! true...

บางครั้งก็มีนามแฝงเช่น:

alias forever='while :; do'

ดังนั้นคุณสามารถทำสิ่งที่ชอบ:

forever cmd; done

มีคนไม่กี่คนที่รู้ว่าเงื่อนไขเป็นรายการคำสั่ง ตัวอย่างเช่นคุณเห็นคนเขียน:

while :; do
  cmd1
  cmd2 || break
  cmd3
done

เมื่อพวกเขาสามารถเขียนได้:

while
  cmd1
  cmd2
do
  cmd3
done

มันสมเหตุสมผลแล้วที่จะเป็นลิสต์ที่คุณมักจะต้องการทำสิ่งต่าง ๆwhile cmd1 && cmd2; do...; doneซึ่งเป็นลิสต์คำสั่งด้วย

ไม่ว่าในกรณีใดก็ตามโปรดทราบว่า[คำสั่งนี้เหมือนคำสั่งอื่น ๆ (แม้ว่ามันจะมีอยู่แล้วในเชลล์แบบบอร์นที่ทันสมัย) แต่ก็ไม่จำเป็นต้องใช้ในรายการif/ while/ untilเงื่อนไขเพียงอย่างเดียวและรายการเงื่อนไขเหล่านั้นไม่มี เพื่อใช้คำสั่งนั้นมากกว่าคำสั่งอื่น ๆ


¹ :นั้นสั้นกว่าและยอมรับข้อโต้แย้ง (ซึ่งจะละเว้น) ในขณะที่พฤติกรรมของtrueหรือfalseไม่ได้ระบุถ้าคุณผ่านมันโต้แย้งใด ๆ ดังนั้นหนึ่งอาจทำเช่น:

while : you wait; do
  something
done

แต่พฤติกรรมของ:

until false is true; do
  something
done

ไม่ได้ระบุ (แม้ว่าจะใช้งานได้ในเชลล์ / falseการนำไปใช้งานส่วนใหญ่)


12

while :เป็นวงไม่สิ้นสุด :ไม่ทำอะไรเลย (สำเร็จ)

ดังนั้นหากคุณต้องการให้เปลือกแขวนตลอดไปโดยไม่ทำอะไรเลยคุณสามารถเขียนมันได้

while :
do
    :
done

หรือเป็นบรรทัดเดียวด้วย;แทนที่จะขึ้นบรรทัดใหม่:while :; do :; done

while :มักจะใช้ถ้าคุณต้องการทำบางสิ่งซ้ำ ๆ โดยไม่แนบเงื่อนไขพิเศษ คุณอาจใช้continue, breakงบภายในวงที่จะควบคุมมันหรือเพื่อเลื่อนสภาพที่ส่วนท้ายของห่วงเหมือนที่do ... whileสร้าง


12

อย่างไรก็ตามคำสั่งหลังจากนั้นจะต้องเป็นจริงหรือเท็จ

ไม่มีคำสั่งในส่วนของสภาพที่สามารถใช้คำสั่งใด ๆ(*) คำสั่งเชลล์ทั้งหมดมีค่าส่งคืนบางส่วนและwhileลูป (รวมถึงifเงื่อนไข) รับค่าส่งคืนของศูนย์เป็น "true" และอื่น ๆ ทั้งหมดเป็น "false" (* หรือรายการคำสั่งหลายคำสั่งคำสั่งสุดท้ายนับ)

สำหรับ:, ทุบตีคู่มือบอกอย่างชัดเจนว่าสถานะการกลับมาของที่เป็น:

: [arguments]
อย่าทำอะไรเลยนอกจากการขยายข้อโต้แย้งและทำการเปลี่ยนเส้นทาง สถานะการส่งคืนเป็นศูนย์

helpbuiltin จะยิ่งชัดเจนมากขึ้น:

 $ help :
 [...]
 No effect; the command does nothing
 Exit Status:
 Always succeeds.

s/any command/any sequence of commands/ในฐานะที่เป็นStéphaneทำให้ชัดเจน
Toby Speight
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.