ป้ายกำกับ: Unauthorized

Shell Script: ดูตัวอย่างการเขียน CLI Argument Parser ด้วย getopts แบบสมบูรณ์Shell Script: ดูตัวอย่างการเขียน CLI Argument Parser ด้วย getopts แบบสมบูรณ์

การสร้าง Command Line Interface (CLI) ที่มีประสิทธิภาพและมีความทนทานต่อข้อผิดพลาด (Robust) ถือเป็นทักษะสำคัญสำหรับ System Administrator และ Software Developer ทุกคน เมื่อสคริปต์ของเราต้องรับอาร์กิวเมนต์ที่หลากหลาย ไม่ว่าจะเป็นตัวเลือกแบบย่อ (Flags) เช่น -v หรือตัวเลือกที่มีค่า (Options) เช่น --user การพึ่งพาการวนลูปผ่าน $@ เพียงอย่างเดียวนั้นไม่เพียงพอ

ในโลกของ Bash Scripting, getopts คือเครื่องมือมาตรฐานที่ออกแบบมาโดยเฉพาะเพื่อจัดการและแยกแยะ Flags และ Options เหล่านี้ ทำให้โค้ดของเรามีความเป็นระเบียบและจัดการสถานการณ์ที่ซับซ้อนได้ง่ายขึ้น บทความนี้จะพาคุณไปเจาะลึกการใช้งาน getopts เพื่อสร้าง Argument Parser ที่สมบูรณ์แบบ พร้อมตัวอย่างการนำไปใช้เชื่อมต่อกับระบบฐานข้อมูล PostgreSQL

⚙️ getopts คืออะไร? หัวใจของการ Parse Arguments

getopts เป็นคำสั่ง built-in ของ Shell ที่มีหน้าที่อ่านและตีความตัวเลือกแบบย่อ (Short Options) เช่น -d หรือ -u โดยจะตรวจสอบว่าตัวเลือกนั้นๆ ต้องการค่า (Argument Value) ตามมาหรือไม่ ทำให้เราสามารถกำหนดตัวแปรภายในสคริปต์ได้อย่างแม่นยำ

หลักการทำงานที่ทรงพลังที่สุดคือการผสาน getopts เข้ากับวงจร while loop เพื่อให้สคริปต์สามารถประมวลผลอาร์กิวเมนต์ทั้งหมดที่ป้อนเข้ามาได้อย่างเป็นระบบ ไม่ว่าจะเป็นการผสมผสานระหว่าง Flags, Options, และ Positional Arguments

💻 โครงสร้าง Argument Parser ด้วย Bash และ getopts

เราจะใช้โครงสร้าง while case %? != null; do ... done เพื่อวนลูปผ่านตัวเลือกทั้งหมดที่ป้อนเข้ามา ตัวอย่างนี้จะจำลองสคริปต์ที่รับค่าการเชื่อมต่อฐานข้อมูล (Database) และโหมดการทำงาน (Mode) มาใช้:

BASH / Shell

#!/bin/bash

# กำหนดตัวแปรเริ่มต้น
DB_NAME=""
MODE=""

# ใช้ getopts เพื่อประมวลผลตัวเลือกแบบย่อ
while getopts :d:m do
  case ${OPTARG}
    # ตัวเลือก -d ต้องตามด้วยค่า (Argument Value)
    d:)
      DB_NAME="$OPTARG"
      ;; 
    # ตัวเลือก -m ต้องตามด้วยค่า
    m:)
      MODE="$OPTARG"
      ;; 
    # กรณีที่ไม่รู้จักตัวเลือก
    
    
    :)*
      echo "[ERROR] ไม่รู้จักตัวเลือก: -$OPTARG" >&2
      exit 1
      ;; 
  esac
done

# ตัวอย่างการใช้งานค่าที่ Parse ได้
echo "--- การตั้งค่าที่ได้รับ ---"
echo "Database Name: $DB_NAME"
echo "Operation Mode: $MODE"

# ส่วนที่ 2: การนำค่าที่ได้ไปใช้กับ PostgreSQL
if [[ -n "$DB_NAME" ]]; then
  echo "
[INFO] กำลังเชื่อมต่อและรันคำสั่ง SQL สำหรับ DB: $DB_NAME"
  # ตัวอย่างการใช้ค่าที่ได้ไปสร้างคำสั่ง SQL
  # ในความเป็นจริง ควรใช้ psql -d $DB_NAME -c "..."
  echo "------------------------------------------------------------------"
  echo "sql_command="SELECT * FROM users WHERE status = 'active' AND db_name = '$DB_NAME';""
  echo "------------------------------------------------------------------"
fi

💡 การบูรณาการกับ PostgreSQL

หลังจากที่ Bash Script ได้ทำการ Parse อาร์กิวเมนต์ทั้งหมดแล้ว ตัวแปรเหล่านั้น (เช่น $DB_NAME) จะถูกส่งต่อไปใช้ในส่วนที่เหลือของสคริปต์ เพื่อสร้างคำสั่งที่ทำงานร่วมกับระบบภายนอก เช่น PostgreSQL

ในตัวอย่างข้างต้น เราใช้ตัวแปร $DB_NAME ที่ได้จากการ Parse มาจำลองการสร้างคำสั่ง SQL เพื่อแสดงให้เห็นว่าสคริปต์ของเราสามารถทำงานได้อย่างมีเงื่อนไขและมีความปลอดภัยในการส่งค่าตัวแปรเข้าสู่คำสั่งฐานข้อมูล

SQL

-- ตัวอย่างการรันคำสั่งผ่าน psql โดยใช้ตัวแปรที่ Parse มา
psql -d "$DB_NAME" -c "SELECT count(*) FROM products WHERE category = 'electronics';"

✅ บทสรุป: การเขียนสคริปต์ที่สมบูรณ์

การใช้ getopts ไม่เพียงแต่ช่วยให้สคริปต์ของเราอ่านง่ายขึ้นเท่านั้น แต่ยังช่วยเพิ่มความทนทาน (Robustness) ให้กับโค้ดอย่างมาก ด้วยการแยกแยะระหว่างตัวเลือกและค่าที่ถูกต้องอย่างชัดเจน การเข้าใจ Pattern นี้จึงเป็นกุญแจสำคัญในการพัฒนา CLI Tools ระดับมืออาชีพ และเมื่อรวมกับการจัดการการเชื่อมต่อฐานข้อมูลอย่าง PostgreSQL ก็จะทำให้ระบบอัตโนมัติของเรามีความสมบูรณ์แบบอย่างแท้จริง