ฉันกำลังมีปัญหาในการหาเซมิโคลอนและ / หรือเครื่องหมายปีกกาที่ถูกต้อง ฉันต้องการทำเช่นนี้ แต่เป็นหนึ่งซับจากบรรทัดคำสั่ง:
while [ 1 ]
do
foo
sleep 2
done
ฉันกำลังมีปัญหาในการหาเซมิโคลอนและ / หรือเครื่องหมายปีกกาที่ถูกต้อง ฉันต้องการทำเช่นนี้ แต่เป็นหนึ่งซับจากบรรทัดคำสั่ง:
while [ 1 ]
do
foo
sleep 2
done
คำตอบ:
while true; do foo; sleep 2; done
โดยวิธีการถ้าคุณพิมพ์เป็น multiline (ตามที่คุณแสดง) ที่พรอมต์คำสั่งแล้วเรียกประวัติด้วยลูกศรขึ้นคุณจะได้รับมันในบรรทัดเดียวคั่นอย่างถูกต้อง
$ while true
> do
> echo "hello"
> sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do echo "hello"; sleep 2; done
cmdhist
ตัวเลือกว่าคุณใช้ทุบตีหรือไม่?
while true; do sh /Users/myuser/bin/vpn ; done
นอกจากนี้ยังเป็นไปได้ที่จะใช้คำสั่ง sleep ในขณะที่สภาพของ ทำให้สายการบินหนึ่งดูสะอาดยิ่งขึ้น
while sleep 2; do echo thinking; done
while echo thinking ; do sleep 2 ; done
แน่นอนถ้าคำสั่ง [ขณะ] ล้มเหลววงออกดังนั้นคุณจะต้องwhile echo thinking || true ; do sleep 2 ; done
แต่แล้วคุณจะกลับมาwhile true ; ...
โคลอนเป็น "จริง" เสมอ:
while :; do foo; sleep 2; done
: [arguments]
ไม่มีผลกระทบ; คำสั่งไม่ทำอะไรเลยนอกเหนือจากการขยายข้อโต้แย้งและดำเนินการเปลี่ยนเส้นทางที่ระบุ ส่งคืนรหัสทางออกศูนย์
คุณสามารถใช้เครื่องหมายอัฒภาคเพื่อแยกข้อความสั่งได้:
$ while [ 1 ]; do foo; sleep 2; done
คุณยังสามารถใช้ประโยชน์จากuntil
คำสั่ง:
until ((0)); do foo; sleep 2; done
โปรดทราบว่าในทางตรงกันข้ามกับwhile
,until
จะดำเนินการคำสั่งที่อยู่ภายในวงตราบใดที่สภาพการทดสอบมีสถานะทางออกที่ไม่เป็นศูนย์
ใช้while
วง:
while read i; do foo; sleep 2; done < /dev/urandom
ใช้for
วง:
for ((;;)); do foo; sleep 2; done
วิธีอื่นโดยใช้until
:
until [ ]; do foo; sleep 2; done
until ((0)); do foo; sleep 2; done
ดูเหมือนจะไม่ทำงาน มันไม่มีที่สิ้นสุดอย่างต่อเนื่อง
วนรอบไม่สิ้นสุดง่ายมาก .. :)
while true ; do continue ; done
fr คำถามของคุณมันจะเป็น:
while true; do foo ; sleep 2 ; done
ฉันต้องการใช้เครื่องหมายอัฒภาคสำหรับคำสั่ง WHILE เท่านั้นและตัวดำเนินการ && เพื่อให้ลูปทำมากกว่าหนึ่งอย่าง ...
ดังนั้นฉันจะทำเช่นนี้เสมอ
while true ; do echo Launching Spaceship into orbit && sleep 5s && /usr/bin/launch-mechanism && echo Launching in T-5 && sleep 1s && echo T-4 && sleep 1s && echo T-3 && sleep 1s && echo T-2 && sleep 1s && echo T-1 && sleep 1s && echo liftoff ; done
&&
วงวนนั้นเหมือนกับเวลาอื่น ๆ จริง ๆ ใช่ไหม คุณต้องการสิ่งที่สองที่จะเกิดขึ้นเฉพาะในกรณีที่เกิดขึ้นครั้งแรกแล้วใช้&&
อย่างอื่น;
พอเพียง จริงๆแล้วคุณต้องการให้เนื้อหาของวงนั้นสั้นและเรียบง่ายเป็นเลิศเพียงคำสั่งเดียวดังนั้นฟังก์ชั่นหรือสคริปต์
สำหรับกระบวนการดูง่าย ๆ ใช้watch
แทน
การใช้while
:
while true; do echo 'while'; sleep 2s; done
ใช้for
วน:
for ((;;)); do echo 'forloop'; sleep 2; done
การใช้Recursion
(แตกต่างจากด้านบนเล็กน้อยขัดจังหวะโดยแป้นพิมพ์จะไม่หยุด)
list(){ echo 'recursion'; sleep 2; list; } && list;
หากคุณต้องการให้ลูป while หยุดหลังจากเงื่อนไขบางอย่างและfoo
คำสั่งของคุณจะส่งกลับไม่ใช่ศูนย์เมื่อตรงตามเงื่อนไขนี้แล้วคุณจะได้รับลูปที่จะแบ่งเป็นดังนี้
while foo; do echo 'sleeping...'; sleep 5; done;
ตัวอย่างเช่นหากfoo
คำสั่งกำลังลบสิ่งต่าง ๆ ในแบตช์และมันจะส่งคืน 1 เมื่อไม่มีอะไรเหลือให้ลบ
สิ่งนี้จะทำงานได้ดีหากคุณมีสคริปต์ที่กำหนดเองซึ่งจำเป็นต้องเรียกใช้คำสั่งหลายครั้งจนกระทั่งมีเงื่อนไขบางประการ คุณเขียนสคริปต์เพื่อออกด้วย1
เมื่อเป็นไปตามเงื่อนไขและออก0
เมื่อควรทำงานอีกครั้ง
ตัวอย่างเช่นสมมติว่าคุณมีสคริปต์ไพ ธ อนbatch_update.py
ซึ่งจะอัปเดต 100 แถวในฐานข้อมูลและส่งคืน0
หากมีมากกว่าที่จะอัปเดตและ1
หากไม่มีอีกต่อไป คำสั่งต่อไปนี้จะช่วยให้คุณอัปเดตแถวละ 100 พร้อมกับพักเป็นเวลา 5 วินาทีระหว่างการปรับปรุง:
while batch_update.py; do echo 'sleeping...'; sleep 5; done;
foo
ออกคำสั่งด้วยรหัส1
เมื่อคุณต้องการให้ลูป while หยุดพัก ฉันได้อัปเดตคำตอบของฉันด้วยตัวอย่าง
ถ้าฉันสามารถยกตัวอย่างสองตัวอย่าง (พร้อมกับ "อารมณ์")
สิ่งนี้จะเขียนชื่อของไฟล์ทั้งหมดที่ลงท้ายด้วย ".jpg" ในโฟลเดอร์ "img":
for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; done
วิธีนี้จะลบ:
for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done
แค่พยายามมีส่วนร่วม
ls -1 *.jpg
และrm *.jpg
คุณสามารถลองทำสิ่งนี้ได้เช่นกันคำเตือน: สิ่งนี้คุณไม่ควรทำ แต่เนื่องจากคำถามที่ถามถึงการวนซ้ำแบบไม่มีที่สิ้นสุดโดยไม่สิ้นสุด ... นี่คือวิธีที่คุณทำได้
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done