สคริปต์คืออะไร?
สคริปต์คือชุดคำสั่งที่เขียนในภาษาสคริปติ้งต่างๆ (เช่น Bash, Python, JavaScript และอื่นๆ) ที่ช่วยให้คุณทำงานอัตโนมัติหรือควบคุมกระบวนการต่างๆ ได้ ต่างจากโปรแกรมที่คอมไพล์แล้ว สคริปต์มักจะเป็นแบบ interpreted หมายถึงถูกดำเนินการโดยสภาพแวดล้อมรันไทม์โดยตรงโดยไม่ต้องคอมไพล์ก่อน
สคริปต์เป็นเครื่องมืออันทรงพลังสำหรับการทำงานอัตโนมัติของงานซ้ำๆ การจัดการเวิร์กโฟลว์ และการแก้ปัญหาขนาดเล็ก (และบางครั้งขนาดใหญ่) อย่างมีประสิทธิภาพ ไม่ว่าคุณจะเป็นมือใหม่หรือนักพัฒนาที่มีประสบการณ์ การเข้าใจวิธีเขียนสคริปต์จะช่วยเพิ่มประสิทธิภาพการทำงานและขยายความสามารถทางเทคนิคของคุณ
ทำไมต้องเขียนสคริปต์?
เราได้กล่าวถึงสิ่งที่สคริปต์ทำได้แล้ว มาดูข้อดี (และความท้าทาย) ของมันเพื่อเข้าใจว่าทำไมจึงทรงพลัง และเมื่อไหร่ควรใช้งาน
ข้อดีของสคริปต์
- อัตโนมัติ: สคริปต์ช่วยลดความซับซ้อนของงานซ้ำๆ เช่น การประมวลผลข้อมูลหรือการจัดการไฟล์
- ประสิทธิภาพ: ช่วยประหยัดเวลาจากการทำงานที่ต้องทำด้วยมือ
- ลดข้อผิดพลาด: ช่วยลดข้อผิดพลาดของมนุษย์ผ่านการดำเนินการคำสั่งอย่างสม่ำเสมอ
- ความยืดหยุ่น: ปรับตัวเข้ากับงานหลากหลายได้ด้วยการแก้ไขน้อยที่สุด
- การรวมระบบ: รวมเข้ากับระบบ เครื่องมือ หรือเวิร์กโฟลว์อื่นๆ ได้อย่างราบรื่น
ความท้าทายของสคริปต์
- ประสิทธิภาพ: สคริปต์อาจช้ากว่าโปรแกรมที่คอมไพล์แล้ว เนื่องจากโอเวอร์เฮดของการแปลภาษา
- ความสามารถในการขยาย: ไม่เหมาะสำหรับงานขนาดใหญ่หรือซับซ้อนมาก
- การดีบัก: การดีบักสคริปต์อาจท้าทายได้ เนื่องจากธรรมชาติแบบไดนามิก
- ความเสี่ยงด้านความปลอดภัย: สคริปต์ที่เขียนไม่ดีอาจเปิดโอกาสให้มีช่องโหว่ โดยเฉพาะถ้ารันคำสั่งระดับระบบ
เมื่อไหร่ควรใช้ และไม่ควรใช้สคริปต์
เหมาะสำหรับ:
- งานที่เรียบง่าย ชัดเจน หรือครั้งเดียว
- โปรโตไทป์หรือทำงานอัตโนมัติอย่างรวดเร็ว
- ขอบเขตเล็กพอที่จะหลีกเลี่ยงความซับซ้อน
ไม่เหมาะสำหรับ:
- งานที่ต้องการประสิทธิภาพสูง ควรใช้ ETL tools, message broker หรือเครื่องมือเฉพาะทางแทน
- แอปพลิเคชันที่มี UI ซับซ้อน ควรสร้างแอปเล็กๆ หรือระบบโมดูลาร์พร้อม logging, testing, documentation
- สถานการณ์ที่ต้องการบำรุงรักษาระยะยาว โปรแกรมที่คอมไพล์อาจเสถียรกว่า ควรใช้ task schedulers หรือ workflow managers เช่น CRON, Airflow, AWS Lambda/GCP Functions
วิธีเขียนสคริปต์ที่มีประสิทธิภาพ
นี่คือกระบวนการที่ผมใช้ หลังจากนี้เราจะดูตัวอย่างสคริปต์ในภาษาต่างๆ เพื่อฝึกปฏิบัติจริง
- กำหนดปัญหา: ก่อนเขียน ให้ระบุปัญหาที่จะแก้ ให้ชัดเจนเกี่ยวกับงานที่จะทำอัตโนมัติและผลลัพธ์ที่คาดหวัง
- เลือกภาษาที่เหมาะสม:
- Bash: เหมาะสำหรับงานระดับระบบ เช่น การจัดการไฟล์หรือเซิร์ฟเวอร์
- Python: เหมาะสำหรับประมวลผลข้อมูล, web scraping, และอัตโนมัติที่ซับซ้อนกว่า
- JavaScript: เหมาะสำหรับพัฒนาเว็บและอัตโนมัติบนเบราว์เซอร์
- เขียนสคริปต์: ใช้ text editor หรือ IDE ปฏิบัติตาม best practices เช่น ใช้คอมเมนต์ ตั้งชื่อตัวแปรที่มีความหมาย และเขียนโค้ดแบบโมดูลาร์
- ทดสอบสคริปต์: ทดสอบในสภาพแวดล้อมที่ควบคุมได้ เพื่อให้แน่ใจว่าทำงานตามที่คาดหวังโดยไม่ก่อให้เกิดข้อผิดพลาด
- รันและปรับใช้: รันในสภาพแวดล้อมจริง หากจำเป็น ให้จัดตารางการรันด้วยเครื่องมืออย่าง Cron (สำหรับ Bash) หรือ task schedulers
ตัวอย่างสคริปต์
สมมติว่าคุณมีไฟล์ประมาณ 100 ไฟล์ ชื่อ "book-part-1.pdf", "book-part-2.pdf", ..., "book-part-100.pdf" คุณต้องการเปลี่ยนเครื่องหมายขีด (-) ทั้งหมดในชื่อไฟล์เป็น underscore (_) เนื่องจากเว็บไซต์ที่จะอัปโหลดไม่อนุญาตให้อัปโหลดไฟล์ที่ชื่อมีขีด
นี่คือสคริปต์ 3 ภาษาที่ทำงานเดียวกัน กระบวนการคือ:
- ค้นหาไฟล์ทั้งหมดในไดเรกทอรี
- ตรวจสอบว่าชื่อไฟล์มีขีด (-) หรือไม่
- แทนที่ขีดทั้งหมดด้วย underscore (_)
สคริปต์ Bash
#!/bin/bash
# แทนที่ "-" ด้วย "_" ในชื่อไฟล์
DIRECTORY="/path/to/your/folder"
for FILE in "$DIRECTORY"/*; do
if [[ "$FILE" == *-* ]]; then
NEW_NAME=$(echo "$FILE" | sed 's/-/_/g')
mv "$FILE" "$NEW_NAME"
echo "Renamed: $FILE -> $NEW_NAME"
fi
done
กำหนดไดเรกทอรีที่เก็บไฟล์ไว้บนสุด สำหรับแต่ละไฟล์ในไดเรกทอรี ตรวจสอบว่าชื่อมี - หรือไม่ ถ้ามี สร้างชื่อใหม่เก็บใน NEW_NAME โดยใช้ echo คัดลอกชื่อเก่า และ sed แทนที่ - ด้วย _ แล้วใช้คำสั่ง mv เปลี่ยนชื่อ
สคริปต์ Python
import os
# แทนที่ "-" ด้วย "_" ในชื่อไฟล์
directory = "/path/to/your/folder"
for filename in os.listdir(directory):
if "-" in filename:
old_path = os.path.join(directory, filename)
new_filename = filename.replace("-", "_")
new_path = os.path.join(directory, new_filename)
os.rename(old_path, new_path)
print(f"Renamed: {filename} -> {new_filename}")
ขั้นตอนคล้ายกัน กำหนดไดเรกทอรี แล้ววนลูปไฟล์แต่ละไฟล์ด้วย os.listdir ตรวจสอบว่ามี - ในชื่อหรือไม่ สร้าง path เดิมและใหม่ แล้วใช้ os.rename เปลี่ยนชื่อ
สคริปต์ JavaScript
const fs = require('fs');
const path = require('path');
const directory = '/path/to/your/folder';
fs.readdir(directory, (err, files) => {
if (err) {
console.error('Error reading directory:', err);
return;
}
files.forEach(file => {
if (file.includes('-')) {
const oldPath = path.join(directory, file);
const newFilename = file.replace(/-/g, '_');
const newPath = path.join(directory, newFilename);
fs.rename(oldPath, newPath, err => {
if (err) {
console.error(`Error renaming ${file}:`, err);
} else {
console.log(`Renamed: ${file} -> ${newFilename}`);
}
});
}
});
});
JavaScript ใช้ package fs และ path โค้ดค่อนข้างยาวกว่า Python/ Bash โดยทั่วไปนักพัฒ้านิยม Bash/Python สำหรับงานนี้ JavaScript เหมาะกับอัตโนมัติบนเบราว์เซอร์มากกว่า
วิธีรันสคริปต์เหล่านี้
- แทนที่
/path/to/your/folderด้วยไดเรกทอรีจริงที่เก็บไฟล์ - รันในสภาพแวดล้อมที่เหมาะสม:
- Bash: บันทึกเป็น
.shรันด้วยbash script.sh - Python: บันทึกเป็น
.pyรันด้วยpython script.py - JavaScript: บันทึกเป็น
.jsรันด้วยnode script.js
- Bash: บันทึกเป็น
สคริปต์แบบทำซ้ำ (Recurring Scripts)
สคริปต์แบบทำซ้ำ 設計มาเพื่อรันเป็นระยะ เช่น ตรวจสอบสถานะระบบรายสัปดาห์ ล้างล็อก หรือดึงข้อมูลอัปเดต มักใช้ task scheduler
วิธีทั่วไป
- CRON jobs: ระบบปฏิบัติการส่วนใหญ่รองรับ CRON สำหรับจัดตารางรันสคริปต์
- Task queues: เครื่องมืออย่าง Celery (Python), Bull (Node.js), Sidekiq (Ruby) จัดการงานที่จัดตารางได้ยืดหยุ่นกว่า
- Cloud schedulers: บริการอย่าง AWS Lambda + EventBridge, Google Cloud Scheduler, Azure Logic Apps สำหรับสถาปัตยกรรม serverless
ตัวอย่างใช้งานดีคือ ส่งรายงานรายวัน/รายสัปดาห์ของการใช้งานระบบ เช่น สคริปต์นับจำนวนผู้ใช้ที่สมัครและสมัครสมาชิก แล้วส่งอีเมลทุกวัน/สัปดาห์
Best Practices สำหรับการเขียนสคริปต์
1. ใช้คอมเมนต์: อธิบายส่วนที่ซับซ้อน
# คำนวณราคารวมภาษี
def calculate_price_with_tax(price, tax_rate):
# อัตราภาษีเป็นทศนิยม (เช่น 0.07 สำหรับ 7%)
return price + (price * tax_rate)
2. จัดการข้อผิดพลาด: คาดการณ์และจัดการ error ให้เหมาะสม
try:
with open('data.csv', 'r') as file:
data = file.readlines()
except FileNotFoundError:
print("Error: 'data.csv' file not found. Make sure the file exists before running the script.")
except Exception as e:
print(f"An unexpected error occurred: {e}")
3. ออกแบบแบบโมดูลาร์: แบ่งเป็นฟังก์ชัน/โมดูลที่ใช้ซ้ำได้
def fetch_data_from_api(api_url):
# ดึงข้อมูลจาก API
pass
def process_data(data):
# ประมวลผลข้อมูล
pass
def save_to_file(data, filename):
# บันทึกข้อมูล
pass
if __name__ == "__main__":
data = fetch_data_from_api("https://example.com/api")
processed_data = process_data(data)
save_to_file(processed_data, "output.json")
4. ตรวจสอบอินพุต: validate input เพื่อป้องกัน error หรือช่องโหว่
import re
def validate_email(email):
pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
if not re.match(pattern, email):
raise ValueError("Invalid email address format")
return email
5. ใช้ Version Control: ใช้ Git ติดตามการเปลี่ยนแปลง
git init
git add script.py
git commit -m "Initial commit"
สรุป
การเขียนสคริปต์เป็นทักษะที่เพิ่มประสิทธิภาพและความสามารถในการแก้ปัญหาได้อย่างมาก ด้วยการเข้าใจพื้นฐานของ Bash, Python, JavaScript คุณสามารถทำงานอัตโนมัติ ลดขั้นตอนการทำงาน และประหยัดเวลาที่มีค่า เริ่มจากเล็กๆ สร้างทีละขั้นตอน และฝึกเขียนสคริปต์สำหรับกรณีใช้งานต่างๆ เพื่อเชี่ยวชาญทักษะนี้
มีแบบฝึกหัดให้คุณ: เพื่อรันและทดสอบตัวอย่าง คุณอาจคิดว่าต้องสร้าง 100 ไฟล์ด้วยมือ ซึ่งใช้เวลานาน ผมเขียนสคริปต์สร้าง 100 ไฟล์ไว้ แนะนำให้ลองเขียนสคริปต์สร้าง 100 ไฟล์ที่มีขีดในชื่อ แล้วรันสคริปต์ตัวอย่างเพื่อแปลงเป็น underscore
อาจดูยากตอนแรก แต่จริงๆ แค่ 5 บรรทัด Bash ก็สร้าง 100 ไฟล์ได้ ไม่ใช่แค่ 100 - แต่มลลื่น/ล้าน/ล้านล้าน ไฟล์ก็ได้ด้วย 5 บรรทัดเดียวกัน
อยากเรียนรู้เพิ่มเติม สมัครรับจดหมายข่าว (https://5minslearn.gogosoon.com/) และติดตามโซเชียลมีเดีย
Happy scripting!