🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

[ฉบับสมบูรณ์] 5 รูปแบบ Bash ที่ควรจำและวิธีหลีกเลี่ยงข้อผิดพลาด

ในซีรีส์แนะนำ Bash ที่ผ่านมา คุณได้สร้างเสริมความแข็งแกร่งพื้นฐานในการควบคุมจอสีดำ ตั้งแต่คำสั่งพื้นฐานไปจนถึงการสร้างสคริปต์ง่ายๆ คุณอาจจะเริ่มรู้สึกแล้วว่าการทำงานในแต่ละวันสะดวกขึ้นเล็กน้อยเมื่อนำคำสั่งต่างๆ มาผสมผสานกัน ทำได้ดีมากครับ!

และในตอนสุดท้ายของซีรีส์ Bash นี้ เราจะก้าวไปอีกขั้นจากสคริปต์ที่ "แค่ทำงานได้" ไปสู่สคริปต์ระดับมืออาชีพที่ "ปลอดภัย, อ่านง่าย, และเกิดข้อผิดพลาดได้ยาก" โดยจะมาถ่ายทอด 5 รูปแบบที่สำคัญเป็นพิเศษและวิธีหลีกเลี่ยง "กับดัก" ที่มือใหม่มักจะตกหลุมพราง

สิ่งที่เราจะแนะนำต่อไปนี้ไม่ใช่คำสั่งใหม่ที่ยากเย็นอะไร แต่เป็นเหมือน "เคล็ดลับการขับรถ" ที่จะบอกว่าควร "ใช้งานความรู้ที่เรียนมาอย่างไรให้ถูกต้อง" เหมือนกับคนที่เพิ่งหัดขับรถใหม่ๆ ที่ต้องเรียนรู้เทคนิคการขับขี่อย่างปลอดภัยในวันฝนตกหรือตอนกลางคืน วันนี้คุณเองก็จะมาเรียนรู้วิธีการเขียนสคริปต์ที่สามารถรันได้อย่างสบายใจในทุกสถานการณ์กันครับ!


รูปแบบที่ 1: ต้องใส่ตัวแปรไว้ใน "เครื่องหมายคำพูดคู่" เสมอ!

นี่คือกฎทองคำที่ต้องยึดถือในการเขียน Bash Script การละเลยที่จะใส่ตัวแปรไว้ในเครื่องหมายคำพูดคู่ " " เป็นสาเหตุใหญ่ที่สุดของข้อผิดพลาดที่ไม่คาดคิด โดยเฉพาะอย่างยิ่งเมื่อตัวแปรมีช่องว่าง (space) รวมอยู่ด้วย

ข้อผิดพลาดที่เจอบ่อย: ตัวแปรที่ไม่มีเครื่องหมายคำพูด

ตัวอย่างเช่น ลองดูสคริปต์ด้านล่างนี้ที่พยายามจะสร้างไดเรกทอรีที่มีช่องว่างในชื่อ

#!/bin/bash
DIR_NAME="My Project"
mkdir $DIR_NAME

เมื่อรันสคริปต์นี้ Bash จะตีความว่าเป็นคำสั่ง mkdir My Project ทำให้เกิดการสร้างไดเรกทอรี 2 อันที่แยกจากกันคือ "My" และ "Project" ซึ่งไม่ใช่ผลลัพธ์ที่เราต้องการ


วิธีปฏิบัติที่ดีที่สุด: ใส่ตัวแปรไว้ใน " "

วิธีแก้ปัญหานี้ง่ายนิดเดียว เพียงแค่ใส่ตัวแปรไว้ในเครื่องหมายคำพูดคู่เท่านั้นเอง ซึ่งจะทำให้ Bash รับรู้ข้อความทั้งหมดที่มีช่องว่างว่าเป็น "ก้อนเดียวกัน" อย่างถูกต้อง

#!/bin/bash
DIR_NAME="My Project"
mkdir "$DIR_NAME" # ใส่ตัวแปรไว้ในเครื่องหมายคำพูดคู่!
echo "สร้างไดเรกทอรี '$DIR_NAME' เรียบร้อยแล้ว"

นิสัยง่ายๆ นี้จะทำให้สคริปต์ของคุณแข็งแกร่งขึ้นอย่างมาก จำขึ้นใจไว้เลยว่า "ต้องใส่ตัวแปรไว้ในเครื่องหมายคำพูดคู่เสมอ"


รูปแบบที่ 2: การออกแบบเพื่อความปลอดภัยให้หยุดทันทีเมื่อเกิดข้อผิดพลาด

จุดที่น่ากลัวของ Bash Script คือแม้ว่าคำสั่งบางอย่างระหว่างทางจะล้มเหลว มันก็จะทำงานต่อไปโดยไม่สนใจอะไรเลย ตัวอย่างเช่น สคริปต์ที่ควรจะ "ย้ายไปยังไดเรกทอรีหนึ่งแล้วลบไฟล์ข้างใน" จะเกิดอะไรขึ้นถ้าการย้ายล้มเหลว? อาจเกิดหายนะที่ไฟล์ถูกลบผิดที่ผิดทางได้

เพื่อป้องกันปัญหานี้ ให้เขียน "คาถา" ต่อไปนี้ไว้ที่ตอนต้นของสคริปต์

set -e

set -e เปรียบเสมือน "อุปกรณ์นิรภัย" ที่จะหยุดการทำงานของสคริปต์ทันทีหากมีคำสั่งใดคำสั่งหนึ่งในสคริปต์เกิดข้อผิดพลาดขึ้นมา ลองดูผลของมันในสคริปต์ด้านล่างนี้


#!/bin/bash
set -e # เปิดใช้งานอุปกรณ์นิรภัย

echo "กำลังเริ่มประมวลผล..."

# พยายามย้ายไปยังไดเรกทอรีที่ไม่มีอยู่จริง และจะเกิดข้อผิดพลาดที่นี่
cd /non-existent-directory

# เนื่องจากมี set -e บรรทัดนี้จะไม่มีวันถูกรัน
echo "ข้อความนี้จะไม่แสดงผล"

เมื่อรันสคริปต์นี้ การประมวลผลจะหยุดลงทันทีที่คำสั่ง cd ล้มเหลว และ echo สุดท้ายจะไม่ถูกรัน สำหรับสคริปต์ที่ต้องจัดการกับข้อมูลสำคัญ ควรใส่บรรทัดนี้ไว้เสมอ


รูปแบบที่ 3: การนำผลลัพธ์ของคำสั่งมาใส่ในตัวแปร

เวลาเขียนสคริปต์ คุณจะเจอกับสถานการณ์ที่ "ต้องการนำ 'ผลลัพธ์' ของคำสั่งหนึ่งไปใช้ในอีกคำสั่งหนึ่งหรือในตัวแปร" อยู่บ่อยครั้ง เช่น การนำวันที่ปัจจุบันมาใส่ในชื่อไฟล์สำรองข้อมูล

เราจะใช้ฟีเจอร์ที่เรียกว่า Command Substitution (การแทนที่คำสั่ง) ซึ่งมีรูปแบบการเขียนคือ $(คำสั่ง)

#!/bin/bash
set -e

# รับวันที่ปัจจุบันในรูปแบบ YYYY-MM-DD แล้วเก็บไว้ในตัวแปร
TODAY=$(date "+%Y-%m-%d")

# นำวันที่มาประกอบเป็นชื่อไฟล์
BACKUP_FILENAME="backup_${TODAY}.tar.gz"

echo "ชื่อไฟล์สำรอง: $BACKUP_FILENAME"
# tar -czf "$BACKUP_FILENAME" /path/to/backup/source

ส่วนของ $(date "+%Y-%m-%d") จะถูกแทนที่ด้วยผลลัพธ์ของคำสั่ง date (เช่น 2025-07-06) ซึ่งช่วยให้คุณสร้างชื่อไฟล์แบบไดนามิกและเข้าใจง่ายได้อย่างสะดวก


รูปแบบที่ 4: การประมวลผลไฟล์ทีละบรรทัดอย่างปลอดภัย

การอ่านไฟล์ข้อความ (เช่น รายชื่อโดเมน, รายชื่อ URL) แล้วประมวลผลทีละบรรทัดเป็นกรณีการใช้งานสคริปต์ที่พบบ่อยมาก แต่ขั้นตอนนี้มี "กับดัก" ที่มือใหม่มักจะพลาด

รูปแบบที่ไม่ควรทำ

การเขียนแบบ for line in $(cat file.txt) ควรหลีกเลี่ยง เพราะหากมีช่องว่างในไฟล์ จะไม่สามารถประมวลผลได้อย่างถูกต้อง

วิธีปฏิบัติที่ดีที่สุด: `while read` loop

รูปแบบมาตรฐานสำหรับการประมวลผลไฟล์ทีละบรรทัดอย่างปลอดภัยและมีประสิทธิภาพคือการใช้ while read loop แม้จะดูซับซ้อนไปหน่อย แต่การจำรูปแบบนี้ไปใช้เลยจะดีที่สุด

ก่อนอื่น ให้เตรียมไฟล์รายชื่อ domains.txt ที่จะใช้ประมวลผล

example.com
example.net
example.org

จากนั้น นี่คือสคริปต์ที่จะอ่านและประมวลผลไฟล์นี้

#!/bin/bash
set -e

INPUT_FILE="domains.txt"

while IFS= read -r line
do
  echo "Processing domain: $line"
  # ณ จุดนี้ คุณสามารถทำการประมวลผลต่างๆ เช่น ping $line หรือ curl http://$line/
done < "$INPUT_FILE"

รูปแบบนี้จะช่วยรักษาช่องว่างที่อยู่ตอนต้นและท้ายบรรทัด และยังจัดการกับอักขระพิเศษได้อย่างถูกต้อง จึงสามารถนำไปประยุกต์ใช้กับการประมวลผลไฟล์ข้อความได้ทุกประเภท


รูปแบบที่ 5: การสร้างและลบไฟล์ชั่วคราวอย่างปลอดภัย

ในระหว่างการทำงานของสคริปต์ บางครั้งอาจจำเป็นต้องใช้ไฟล์ชั่วคราว ในกรณีนี้ การกำหนดชื่อไฟล์แบบตายตัวเช่น /tmp/my_temp_file เป็นสิ่งอันตราย หากมีโปรแกรมอื่นใช้ชื่อไฟล์เดียวกัน หรือมีการรันสคริปต์พร้อมกันหลายครั้ง ไฟล์อาจถูกเขียนทับได้

เพื่อสร้างไฟล์ชั่วคราวอย่างปลอดภัย ให้ใช้คำสั่ง mktemp ซึ่งจะสร้างไฟล์ว่างที่มีชื่อซ้ำกันไม่ได้ขึ้นมาให้

#!/bin/bash
set -e

# สร้างไฟล์ชั่วคราวที่ปลอดภัยและเก็บชื่อไว้ในตัวแปร
TEMP_FILE=$(mktemp)

# ตั้งค่าให้ลบไฟล์ชั่วคราวนี้เสมอเมื่อสคริปต์จบการทำงาน (ไม่ว่าจะจบปกติ, เกิดข้อผิดพลาด, หรือถูกขัดจังหวะ)
trap 'rm -f "$TEMP_FILE"' EXIT

echo "สร้างไฟล์ชั่วคราวแล้ว: $TEMP_FILE"
echo "กำลังเขียนข้อมูลลงในไฟล์นี้..."
echo "some temporary data" > "$TEMP_FILE"

echo "เนื้อหาของไฟล์:"
cat "$TEMP_FILE"

echo "การประมวลผลเสร็จสิ้น ไฟล์ชั่วคราวจะถูกลบโดยอัตโนมัติ"

นอกจากนี้ การใช้คำสั่ง trap ร่วมด้วย จะเป็นการจองการกระทำไว้ล่วงหน้าว่า "ไม่ว่าสคริปต์จะจบลงด้วยเหตุผลใดก็ตาม ให้ลบไฟล์ชั่วคราวนี้ทิ้งตอนท้ายสุดเสมอ" ซึ่งจะช่วยป้องกันไม่ให้มีไฟล์ขยะที่ไม่จำเป็นหลงเหลืออยู่บนเซิร์ฟเวอร์


สรุป

เยี่ยมมากครับ! และนี่คือบทสรุปของซีรีส์แนะนำ Bash ในตอนสุดท้ายนี้ เราได้เรียนรู้ 5 รูปแบบที่สำคัญที่จะยกระดับสคริปต์ของคุณจาก "ของเล่น" เป็น "เครื่องมือระดับมืออาชีพ"

เพียงแค่ตระหนักถึงรูปแบบเหล่านี้ สคริปต์ที่คุณเขียนจะมีความน่าเชื่อถือเพิ่มขึ้นอย่างมาก และกลายเป็นโค้ดที่ดูแลรักษาง่าย ซึ่งตัวคุณในอนาคตหรือผู้อื่นก็สามารถอ่านเข้าใจได้ ขอให้คุณนำความรู้นี้ไปใช้ในการสร้างสคริปต์ต่อๆ ไป ขอให้ชีวิตการสร้างเว็บของคุณ ซึ่งบัดนี้ได้เครื่องมืออันทรงพลังอย่าง Bash มาไว้ในมือแล้ว มีความสร้างสรรค์และมีประสิทธิภาพยิ่งขึ้นไปอีก!