วิธีการทำ for loop ใน command line?


22

ลองทำง่ายๆ for loop

#!/bin/bash

for i in `seq 1 10`;
do
    echo $i
done

อัฒภาค AFAIK ในสคริปต์ทุบตีทำให้เชลล์เรียกใช้คำสั่งปัจจุบันแบบซิงโครนัสแล้วไปที่คำสั่งถัดไป การกด Enter จะทำเช่นเดียวกันยกเว้นจะไม่อนุญาตให้คุณป้อนคำสั่งต่อไปนี้โดยล้างบัฟเฟอร์ทันที

ดังนั้นทำไมเชลล์ไม่สามารถตีความบรรทัดต่อไปนี้

for i in `seq 1 10`; do; echo $i; done

มันfor loopใช้งานได้จริงอย่างไร

คำตอบ:


16

ไวยากรณ์ของการforวนซ้ำจากbashหน้าคู่มือคือ

for name [ [ in [ word ... ] ] ; ] do list ; done

อัฒภาคอาจถูกแทนที่ด้วยผลตอบแทนการขนส่งตามที่ระบุไว้ที่อื่นในbashหน้าคู่มือ: "ลำดับของหนึ่งบรรทัดขึ้นไปอาจปรากฏขึ้นในรายการแทนอัฒภาคเพื่อคั่นคำสั่ง"

อย่างไรก็ตามการย้อนกลับไม่เป็นความจริง คุณไม่สามารถแทนที่บรรทัดใหม่ด้วยเครื่องหมายอัฒภาคโดยพลการ สคริปต์หลายบรรทัดของคุณสามารถแปลงเป็นบรรทัดเดียวตราบใดที่คุณสังเกตกฎไวยากรณ์ข้างต้นและอย่าแทรกเครื่องหมายอัฒภาคพิเศษหลังจากdo:

for i in `seq 1 10`; do echo $i; done

2
สคริปต์สุดท้ายไม่ถูกต้องเนื่องจาก @ dr01 ชี้ให้เห็นคุณจะต้องลบเครื่องหมายอัฒภาคออกหลังจากdoนั้น
Jake

1
@ เจคสิ่งนี้ก็บอกว่าคุณจะต้องลบเครื่องหมายอัฒภาคออกหลังจากdoนั้น นอกจากนี้คำตอบนี้อธิบายถึงสาเหตุที่คุณต้องลบเครื่องหมายอัฒภาคหลังจาก `ทำ '
user4556274

เกิดอะไรขึ้นถ้า$iจำเป็นต้องเป็นส่วนหนึ่งของชื่อไฟล์ จำเป็นต้องใช้เครื่องหมายคำพูดคู่หรือไม่
ไม่ระบุชื่อ

18

อัฒภาคหลังจากdoนั้นเป็นข้อผิดพลาดและไม่ควรอยู่ที่นั่น

การทำงานต่อไปนี้ถูกต้อง:

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