ฉันกำลังพยายามสร้างแอป 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
สิ่งที่อาจทำให้เกิดข้อผิดพลาดนั้น
(ต่อ) ... (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) หากคุณแน่ใจว่าสิ่งที่คุณกำลังทำอยู่นั้น (ในรหัสที่โพสต์)
—
Janis
"$1"
ต้องการเพียงการอ้างถึง (โฆษณา 4) อาจเป็นเพราะเขาหมายถึงIFS
(ไม่ใช่FS
)
;
เซมิโคลอนแบบไม่มีเครื่องหมายในตอนท้ายของบรรทัด . คุณสามารถลบเครื่องหมายอัฒภาคที่ท้ายบรรทัด 157, 161, 165, 168 และ 169 (หรือคุณสามารถทิ้งไว้ในนั้นฉันเดาว่ามันเป็นคำถามของสไตล์) … (ต่อ)