ข้อความข้อผิดพลาด syntax error near unexpected token `(' เกิดขึ้นในสภาพแวดล้อมประเภท Unix, Cygwin และ Command Line Interface ใน Windows ข้อผิดพลาดนี้มักจะถูกกระตุ้นเมื่อคุณพยายามรัน Shell Script ที่แก้ไขหรือสร้างในระบบ DOS/Windows หรือ Mac แบบเก่า
ข้อความข้อผิดพลาดนี้ยัง浮ขึ้นเมื่อคุณป้อนคำสั่งในบรรทัดคำสั่ง Linux สำหรับงานประจำวัน เช่น คัดลอกไฟล์ด้วยตนเอง ฯลฯ สาเหตุหลักที่ข้อผิดพลาดนี้เกิดขึ้น คือ ไวยากรณ์ไม่ถูกต้อง (Bad Syntax) หรือปัญหาของ OS ในการตีความคำสั่ง/Shell ของระบบอื่น
สาเหตุของ Syntax Error near unexpected token `('
เหตุผลของข้อความข้อผิดพลาดนี้หลากหลายมากและไม่สามารถระบุหมดได้ในบทความเดียว เนื่องจากมีความเป็นไปได้หลายพันอย่างที่ Syntax จะผิดพลาดเมื่อรันคำสั่ง เหตุผลหลักคือ:
- Bad Syntax เมื่อรันคำสั่งใดๆ ในแพลตฟอร์มใดๆ — ไม่ได้ใช้คำสั่งถูกต้อง หรือป้อน Syntax ผิด
- Shell ไม่ เข้ากันได้ (Compatible) ระหว่างระบบ Unix/DOS
- มีปัญหาในการรัน Bash Shell Script จาก แหล่งที่มาอื่น
ในบทความนี้เราสมมติว่าคุณรู้พื้นฐานการเขียนโค้ดและมีความเข้าใจว่ากำลังทำอะไร หากคุณเป็นมือใหม่ ควรทำตามบทช่วยสอนเชิงลึกของภาษา/คำสั่งที่พยายามรัน อาจจะพลาดรายละเอียด Syntax บางอย่าง
วิธีแก้ที่ 1: ตรวจสอบ Syntax และ Format ของคำสั่ง
เหตุผลแรกและสำคัญที่สุดที่คุณอาจเจอข้อผิดพลาดนี้ คือ Bad Syntax ในโค้ดของคุณ หรือไม่ปฏิบัติตาม Format ที่แน่นอนของคำสั่ง แต่ละคำสั่งมี Format ที่กำหนดไว้ล่วงหน้า ซึ่งคุณสามารถดูในเอกสารประกอบของมัน พารามิเตอร์บางตัวเป็น Optional บางตัวเป็น Mandatory
นอกจากนี้ ควรระมัดระวังอย่างพิเศษเรื่อง Space เพิ่มเติม, การใช้ Double Quotes, และพารามิเตอร์ Mandatory ที่จำเป็น หากขาดหายไปหรือประกาศผิด คุณจะไม่สามารถรันโค้ดได้
ตัวอย่าง แทนที่จะใช้โค้ดต่อไปนี้:
[mycom7] # ./ctopo.sh um_test1 [(1,2),(2,1)]
คุณต้องรันเป็น:
[mycom7] # ./ctopo.sh um_test1 "[(1,2),(2,1)]"
นอกจากนี้ ตรวจสอบให้แน่ใจว่าคุณรันคำสั่ง/Shell Script ถูกต้องหากมันขยายหลายบรรทัด
เนื่องจากประเภทพารามิเตอร์ Double Quotes จึงจำเป็น Space เพิ่มเติมอาจทำลายโค้ดและบังคับให้ข้อผิดพลาด โปรดตรวจสอบ เอกสารอย่างเป็นทางการ (Official Documentation) ของคำสั่งที่คุณกำลังรัน และดูว่ามีปัญหาที่นั่นหรือไม่
วิธีแก้ที่ 2: Troubleshooting Shell Script ของคุณ
หากคุณใช้ Shell Script ที่ทำงานในระบบต้นทาง (Source System) แต่คืนค่าข้อผิดพลาดในระบบเป้าหมาย (Target) คุณสามารถ Troubleshoot Script ได้โดยตรวจสอบตัวแปรที่จัดเก็บระหว่างการรัน แล้วดูว่าอะไรก่อให้เกิดปัญหา นี่เป็นสาเหตุที่พบบ่อย เนื่องจากในหลายกรณี Shell พยายามตีความตัวอักษรที่พิมพ์ไม่ได้ (Unprintable Character)
ลองรัน Shell ด้วยพารามิเตอร์ 'vx' นี่จะแสดงให้เราเห็นว่าคำสั่งไหนกำลังรัน และค่าไหนถูกจัดเก็บใน Script ผ่านทางนี้คุณสามารถ Troubleshoot และวินิจฉัยว่าอะไรผิดพลาด
ตัวอย่าง รัน Script ใน Terminal หลังรวม 'vx' เข้าไป:
# sh -vx ./test_script5.sh
คุณสามารถตรวจสอบเนื้อหาของ Script ด้วยคำสั่ง 'cat' ได้:
# cat test_script5.sh
วิธีแก้ที่ 3: ใช้คำสั่ง 'dos2unix.exe'
ในไฟล์ข้อความ Windows/DOS บรรทัดใหม่ (New Line) เป็นการรวมของ Carriage Return (\r) ตามด้วย Line Feed (\n) ใน Mac (ก่อน Mac OS X) Line Break ใช้ Carriage Return (\r) เพียงอย่างเดียว Unix/Linux และ Mac OS X ใช้ Line Feed (\n) เป็น Line Break หากคุณใช้ Cygwin มันจะล้มเหลวในการประมวลผล Script ที่สร้างโดย DOS/Windows และ Mac แบบเก่า เนื่องจากตัวอักษร Carriage Return (\r) เพิ่มเติม
ที่นี่คุณสามารถใช้คำสั่ง 'dos2unix.exe' ซึ่งจะแปลง Script ให้เป็น Format ที่ถูกต้อง และจากนั้นคุณสามารถรันได้โดยไม่มีปัญหา
สรุปคุณต้องค้นคว้าคำสั่งและประเภทแพลตฟอร์มที่คุณใช้ และให้แน่ใจว่าไม่มีความไม่สอดคล้องใดๆ เนื่องจากเราไม่สามารถครอบคลุมทุกความเป็นไปได้ คุณควรจะมีความเข้าใจว่ามีข้อผิดพลาดประเภทไหนบ้าง และวิธีแก้ไขอย่างไร