วิธีการแยกออกจากวงใน Bash?


150

ฉันต้องการเขียนสคริปต์ Bash เพื่อประมวลผลข้อความซึ่งอาจต้องใช้ขณะที่ลูป

ตัวอย่างเช่น a while loop ใน C:

int done = 0;
while(1) {
  ...
  if(done) break;
}

ฉันต้องการเขียนสคริปต์ Bash ที่เทียบเท่า แต่สิ่งที่ฉันมักจะใช้และเป็นตัวอย่างคลาสสิกทั้งหมดที่ฉันอ่านได้แสดงให้เห็นคือ:

while read something;
do
...
done

มันไม่มีความช่วยเหลือเกี่ยวกับวิธีการทำwhile(1){}และbreak;สิ่งที่กำหนดไว้อย่างดีและใช้กันอย่างแพร่หลายใน C และฉันไม่ต้องอ่านข้อมูลสำหรับ stdin

ใครสามารถช่วยฉันด้วย Bash เทียบเท่ากับรหัส C ข้างต้น?

คำตอบ:


189

มันไม่ต่างกันbashเลย

done=0
while : ; do
  ...
  if [ "$done" -ne 0 ]; then
      break
  fi
done

:เป็นคำสั่ง no-op สถานะการออกคือ 0 เสมอดังนั้นลูปจะทำงานจนกว่าdoneจะได้รับค่าที่ไม่เป็นศูนย์


มีหลายวิธีที่คุณสามารถตั้งค่าและทดสอบค่าdoneเพื่อออกจากลูป สิ่งที่ฉันแสดงข้างต้นควรทำงานในเปลือกที่รองรับ POSIX


มันโอเคที่จะใช้doneเป็นชื่อตัวแปรหรือไม่? มันเป็นคำหลักของเชลล์ ... ค่อนข้างสับสนอย่างน้อยที่สุด
Michael Dorst

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