สคริปต์เป็นเพียงรายการคำสั่งที่เก็บไว้ในไฟล์ แทนที่จะรันลำดับของคำสั่งโดยการพิมพ์ทีละคำสั่งบนเทอร์มินัล ผู้ใช้ระบบสามารถจัดเก็บคำสั่งทั้งหมด (คำสั่ง) ไว้ในไฟล์และเรียกใช้ไฟล์ซ้ำๆ เพื่อรันคำสั่งซ้ำหลายๆ ครั้ง
ในขณะที่เรียนรู้การเขียนสคริปต์หรือในช่วงเริ่มต้นของการเขียนสคริปต์ ปกติเราจะเริ่มต้นด้วยการเขียนสคริปต์ขนาดเล็กหรือสั้นด้วยคำสั่งสองสามบรรทัด และโดยปกติเราจะดีบักสคริปต์ดังกล่าวโดยไม่ได้ทำอะไรมากไปกว่าการดูผลลัพธ์และตรวจสอบว่าสคริปต์ทำงานตามที่ตั้งใจไว้
อย่างไรก็ตาม เมื่อเราเริ่มเขียนสคริปต์ขั้นสูงและยาวมากด้วยคำสั่งหลายพันบรรทัด เช่น สคริปต์ที่แก้ไขการตั้งค่าระบบ ทำการสำรองข้อมูลที่สำคัญผ่านเครือข่าย และอื่นๆ อีกมากมาย เราจะตระหนักว่าการดูเฉพาะผลลัพธ์ของสคริปต์นั้นไม่ เพียงพอที่จะพบจุดบกพร่องภายในสคริปต์
ดังนั้น ในการดีบักเชลล์สคริปต์ในซีรีส์ Linux เราจะอธิบายวิธีเปิดใช้งานการดีบักเชลล์สคริปต์ ย้ายไปอธิบายโหมดการแก้ไขข้อบกพร่องของเชลล์สคริปต์ต่างๆ และวิธีใช้ในซีรีส์ต่อๆ ไป
วิธีการเริ่มสคริปต์
สคริปต์แตกต่างจากไฟล์อื่นในบรรทัดแรกซึ่งมี #!
(เธอปัง – กำหนดประเภทไฟล์) และชื่อพาธ (path to interpreter) ซึ่งแจ้งระบบว่าไฟล์นั้นเป็นชุดของคำสั่งที่จะตีความโดยโปรแกรมที่ระบุ (ล่าม)
ด้านล่างนี้คือตัวอย่าง “บรรทัดแรก” ในสคริปต์ประเภทต่างๆ:
#!/bin/sh [For sh scripting] #!/bin/bash [For bash scripting] #!/usr/bin/perl [For perl programming] #!/bin/awk -f [For awk scripting]
หมายเหตุ :บรรทัดแรกหรือ #!
สามารถละเว้นได้หากสคริปต์มีเพียงชุดคำสั่งระบบมาตรฐาน โดยไม่มีคำสั่งเชลล์ภายในใดๆ
วิธีการรันเชลล์สคริปต์ใน Linux
ไวยากรณ์ทั่วไปสำหรับการเรียกใช้เชลล์สคริปต์คือ:
$ script_name argument1 ... argumentN
อีกรูปแบบหนึ่งที่เป็นไปได้คือการระบุเชลล์ที่จะรันสคริปต์ให้ชัดเจนดังนี้:
$ shell script_name argument1 ... argumentN
ตัวอย่างเช่น:
$ /bin/bash script_name argument1 ... argumentN [For bash scripting] $ /bin/ksh script_name argument1 ... argumentN [For ksh scripting] $ /bin/sh script_name argument1 ... argumentN [For sh scripting]
สำหรับสคริปต์ที่ไม่มี #!
เป็นบรรทัดแรกและมีเฉพาะคำสั่งระบบพื้นฐาน เช่น คำสั่งด้านล่าง:
#script containing standard system commands cd /home/$USER mkdir tmp echo "tmp directory created under /home/$USER"
เพียงทำให้สามารถเรียกใช้งานได้และเรียกใช้ดังนี้:
$ chmod +x script_name $ ./script_name
วิธีการเปิดใช้งานโหมดดีบักเชลล์สคริปต์
ด้านล่างนี้คือตัวเลือกการดีบักเชลล์สคริปต์หลัก:
-v
(ย่อมาจาก verbose) – บอกให้เชลล์แสดงบรรทัดทั้งหมดในสคริปต์ในขณะที่อ่าน มันเปิดใช้งานโหมด verbose-n
(ย่อมาจาก noexec หรือ no ecxecution) – สั่งให้เชลล์อ่านคำสั่งทั้งหมด แต่ไม่ได้ดำเนินการ ตัวเลือกนี้จะเปิดใช้งานโหมดการตรวจสอบไวยากรณ์-x
(ย่อมาจาก xtrace หรือการติดตามการดำเนินการ) – บอกให้เชลล์แสดงคำสั่งทั้งหมดและอาร์กิวเมนต์บนเทอร์มินัลในขณะที่ดำเนินการ ตัวเลือกนี้เปิดใช้งานโหมดการติดตามเชลล์
1. การปรับเปลี่ยนบรรทัดแรกของเชลล์สคริปต์
กลไกแรกคือการแก้ไขบรรทัดแรกของเชลล์สคริปต์ตามด้านล่าง ซึ่งจะทำให้สามารถแก้จุดบกพร่องของสคริปต์ทั้งหมดได้
#!/bin/sh option(s)
ในแบบฟอร์มด้านบน ตัวเลือกอาจเป็นตัวเลือกเดียวหรือหลายตัวเลือกร่วมกัน
2. เรียกใช้เชลล์ด้วยตัวเลือกการดีบัก
วิธีที่สองคือการเรียกใช้เชลล์ด้วยตัวเลือกการดีบักดังนี้ วิธีการนี้จะเปิดการดีบักของสคริปต์ทั้งหมดด้วย
$ shell option(s) script_name argument1 ... argumentN
ตัวอย่างเช่น:
$ /bin/bash option(s) script_name argument1 ... argumentN
3. การใช้ชุดคำสั่งในตัวของเชลล์
วิธีที่สามคือการใช้คำสั่ง set ในตัวเพื่อดีบักส่วนที่กำหนดของเชลล์สคริปต์ เช่น ฟังก์ชัน กลไกนี้มีความสำคัญ เนื่องจากช่วยให้เราเปิดใช้งานการดีบักในส่วนใดก็ได้ของเชลล์สคริปต์
เราสามารถเปิดโหมดดีบักโดยใช้ set คำสั่งในรูปแบบด้านล่าง โดยที่ option คือตัวเลือกการดีบักใดๆ
$ set option
หากต้องการเปิดใช้งานโหมดแก้ไขข้อบกพร่อง ให้ใช้:
$ set -option
หากต้องการปิดใช้งานโหมดแก้ไขข้อบกพร่อง ให้ใช้:
$ set +option
นอกจากนี้ หากเราเปิดใช้งานโหมดดีบักหลายโหมดในส่วนต่างๆ ของเชลล์สคริปต์ เราสามารถปิดใช้งานโหมดทั้งหมดพร้อมกันได้ดังนี้:
$ set -
นั่นคือตอนนี้ด้วยการเปิดใช้งานโหมดดีบักเชลล์สคริปต์ ดังที่เราได้เห็นแล้ว เราสามารถดีบักเชลล์สคริปต์ทั้งหมดหรือบางส่วนของสคริปต์ได้
ในสองตอนถัดไปของซีรีส์นี้ เราจะพูดถึงวิธีใช้ตัวเลือกการดีบักเชลล์สคริปต์เพื่ออธิบายอย่างละเอียด , การตรวจสอบไวยากรณ์ และ การดีบักการติดตามเชลล์ โหมดพร้อมตัวอย่าง
ที่สำคัญ อย่าลืมถามคำถามใดๆ เกี่ยวกับคู่มือนี้ หรืออาจให้คำติชมผ่านทางส่วนความคิดเห็นด้านล่าง ในระหว่างนี้ ให้เชื่อมต่อกับ Tecmint