ข้อผิดพลาดของไวยากรณ์: จุดสิ้นสุดไฟล์ที่ไม่คาดคิด - สคริปต์ทุบตี [ปิด]


20

ฉันกำลังพยายามสร้างแอป spritz ทุกอย่างทำงานได้ดี แต่ตั้งแต่เมื่อวานฉันได้รับข้อผิดพลาดนี้:

./spritz: บรรทัด 176: ข้อผิดพลาดทางไวยากรณ์: จุดสิ้นสุดไฟล์ที่ไม่คาดคิด

ฉันตรวจสอบไฟล์สคริปต์แล้วและดูเหมือนว่าทุกอย่างจะสมบูรณ์แบบ ฉันสับสนฉันมีคำสั่ง if ในที่สุดและมันก็ดูถูกต้อง! นี่คือส่วนสุดท้าย:

#checks if speed is 150
157 if [[ $2 -eq 150 ]];
158 then
159 starttime=$SECONDS
160      FS=$'\n'
161      for j in `grep --color=always -iP '\b[^aeiou\s]*[aeiou][^aeiou\s]*\K[aeiou]' $1`;
162      do
163            #Reads the text file in the centre of the screen
164            echo "                                                    ___________________"
165            echo "                                                             $j";
166            echo "                                                    ___________________"
167            echo "                                                                               Speed 150 wpm"
168            sleep  0.9;
169            clear;
170       done
171 endtime=$(($SECONDS - $starttime))
172            echo "You read $words_read words in $endtime seconds!"
173       exit 8
174 fi

สิ่งที่อาจทำให้เกิดข้อผิดพลาดนั้น


(0) มันอาจมีประโยชน์มากกว่าที่จะแสดงให้เราเห็นถึงความแตกต่างจากเวอร์ชั่นล่าสุดที่ใช้งานได้ ………………………การสังเกตบางอย่าง (ที่อาจไม่เกี่ยวข้องกับปัญหาปัจจุบันของคุณ): (1) ฉันไม่รู้สถานการณ์ใด ๆ ที่คุณต้องการใช้;เซมิโคลอนแบบไม่มีเครื่องหมายในตอนท้ายของบรรทัด . คุณสามารถลบเครื่องหมายอัฒภาคที่ท้ายบรรทัด 157, 161, 165, 168 และ 169 (หรือคุณสามารถทิ้งไว้ในนั้นฉันเดาว่ามันเป็นคำถามของสไตล์) … (ต่อ)
Scott

1
(ต่อ) ... (2) คุณควรพูดตัวแปรเชลล์เสมอเว้นแต่ว่าคุณไม่มีเหตุผลที่ดีและคุณแน่ใจว่าคุณรู้ว่าคุณกำลังทำอะไรอยู่ เช่น"$1", "$2", และ"$SECONDS" "$starttime"(3) ง่ายต่อการอ่านและแก้จุดบกพร่องรหัสที่เยื้องอย่างถูกต้อง (4) ทำไมคุณถึงตั้งค่าFSและไม่ใช้งาน (5) `…`สามารถเขียน$(…)ได้ (6) $(($SECONDS - $starttime))สามารถเขียนได้เท่าเทียม$((SECONDS - starttime))กัน อีกครั้งนี่เป็นปัญหาของสไตล์ (7) เหตุใดคุณพิมพ์"$words_read"ในลูปเมื่อคุณไม่ได้แก้ไขในลูป
สกอตต์

นี่คือวิธีการแก้ไขข้อบกพร่อง: ลองลบบรรทัดที่ 157-174 และเรียกใช้สคริปต์อีกครั้ง หากคุณยังคงได้รับข้อผิดพลาด (อาจรายงานว่าเป็นที่บรรทัดที่ 157 หรือ 158) คุณจะรู้ว่าปัญหาไม่ได้อยู่ในบรรทัดที่ 157-174 และคุณต้องมองย้อนกลับไปอีก (ดังนั้นให้ทำซ้ำกระบวนการจนกว่าข้อผิดพลาดจะหายไป ) … (ต่อ)
สกอตต์

(ต่อ) เมื่อข้อผิดพลาดหายไปให้ใส่บรรทัดสุดท้ายที่คุณลบออกไปแล้วเริ่มต้นใหม่ ตัวอย่างเช่นถ้าการลบบรรทัด 157-174 ทำให้ข้อผิดพลาดหายไปให้ใส่กลับเข้าไปใหม่ แต่แล้วลบบรรทัด 159-160, 163-168 และ 171-172 ลองแทนที่`grep …`ด้วยรายการค่า กล่าวอีกนัยหนึ่งใช้กระบวนการกำจัด
สกอตต์

ข้อสังเกตเกี่ยวกับความคิดเห็นของ Scott บางส่วน: (โฆษณา 2) หากคุณแน่ใจว่าสิ่งที่คุณกำลังทำอยู่นั้น (ในรหัสที่โพสต์) "$1"ต้องการเพียงการอ้างถึง (โฆษณา 4) อาจเป็นเพราะเขาหมายถึงIFS(ไม่ใช่FS)
Janis

คำตอบ:


29

การวินิจฉัย"จุดสิ้นสุดของไฟล์ที่ไม่คาดคิด"เป็นคำใบ้ว่าคุณมีโครงสร้างการสร้างการเปิดที่ไม่มีใครเทียบหรือไม่ได้ระบุไว้ ( ifw / o fi, dow / o done, การเปิดวงเล็บโดยไม่มีการปิดที่เกี่ยวข้อง หมายเลขบรรทัดที่ชี้ไปยังจุดสิ้นสุดของสคริปต์ไม่เป็นประโยชน์ในกรณีนี้นอกเหนือจากการพูดเพื่อตรวจสอบโครงสร้างการสร้างประโยคของคุณ ข้อผิดพลาดอาจเป็นที่ใดก็ได้ในรหัสของคุณ คุณต้องตรวจสอบว่า


ขอบคุณสำหรับการตอบกลับ. ฉันพบข้อผิดพลาดและแก้ไขมัน!
Scott Pearce

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