TL; DR
ไม่มีคำตอบอื่นใดที่ตอบคำถามดั้งเดิมของคุณว่าเหตุใดคำสั่งจึงให้ข้อผิดพลาดทางไวยากรณ์ นี้เกิดจากคำสั่งที่ขาดหายไประหว่างนั้นและอื่น ๆ
คำสั่งที่หายไป
รหัสต้นฉบับของคุณมีลักษณะดังนี้:
if lsof "$filename" > /dev/null
then
# file is open
else
echo "deleting $filename"
rm "$filename"
fi
ปัญหาคือว่าคุณมีความคิดเห็นระหว่างนั้นและอื่น ๆแต่ความคิดเห็นจะไม่ถือว่าเป็นคำสั่ง ในระยะสั้นคุณสามารถแก้ไขปัญหาที่คุณมี (การพูดเชิงโครงสร้าง) ได้ดังต่อไปนี้:
$ if true; then else echo; fi
bash: syntax error near unexpected token `else'
แก้ไขไวยากรณ์ของคุณด้วย Bourne Builtin
คุณสามารถแก้ไขปัญหานี้ได้โดยการวางคำสั่งจริงก่อนอื่นแต่ความคิดเห็นด้วยตัวเองจะไม่ทำ ส่วนif-thenต้องไม่ว่างเปล่า หากคุณต้องการตัวยึดตำแหน่งคุณสามารถใช้เครื่องหมายจุดคู่ในตัวได้ ตัวอย่างเช่น:
$ if true; then :; else echo; fi
เพียงแค่วาง:
ลงในส่วนระหว่างนั้นและอื่น ๆจะแก้ไขข้อผิดพลาดทางไวยากรณ์ที่คุณกำลังประสบ