Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

มาสเตอร์สคริปติ้ง: เพิ่มประสิทธิภาพการทำงานด้วยการทำงานอัตโนมัติของงานซ้ำๆ

สคริปต์คืออะไร?

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

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

ทำไมต้องเขียนสคริปต์?

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

ข้อดีของสคริปต์

  1. อัตโนมัติ: สคริปต์ช่วยลดความซับซ้อนของงานซ้ำๆ เช่น การประมวลผลข้อมูลหรือการจัดการไฟล์
  2. ประสิทธิภาพ: ช่วยประหยัดเวลาจากการทำงานที่ต้องทำด้วยมือ
  3. ลดข้อผิดพลาด: ช่วยลดข้อผิดพลาดของมนุษย์ผ่านการดำเนินการคำสั่งอย่างสม่ำเสมอ
  4. ความยืดหยุ่น: ปรับตัวเข้ากับงานหลากหลายได้ด้วยการแก้ไขน้อยที่สุด
  5. การรวมระบบ: รวมเข้ากับระบบ เครื่องมือ หรือเวิร์กโฟลว์อื่นๆ ได้อย่างราบรื่น

ความท้าทายของสคริปต์

  1. ประสิทธิภาพ: สคริปต์อาจช้ากว่าโปรแกรมที่คอมไพล์แล้ว เนื่องจากโอเวอร์เฮดของการแปลภาษา
  2. ความสามารถในการขยาย: ไม่เหมาะสำหรับงานขนาดใหญ่หรือซับซ้อนมาก
  3. การดีบัก: การดีบักสคริปต์อาจท้าทายได้ เนื่องจากธรรมชาติแบบไดนามิก
  4. ความเสี่ยงด้านความปลอดภัย: สคริปต์ที่เขียนไม่ดีอาจเปิดโอกาสให้มีช่องโหว่ โดยเฉพาะถ้ารันคำสั่งระดับระบบ

เมื่อไหร่ควรใช้ และไม่ควรใช้สคริปต์

เหมาะสำหรับ:

  1. งานที่เรียบง่าย ชัดเจน หรือครั้งเดียว
  2. โปรโตไทป์หรือทำงานอัตโนมัติอย่างรวดเร็ว
  3. ขอบเขตเล็กพอที่จะหลีกเลี่ยงความซับซ้อน

ไม่เหมาะสำหรับ:

  1. งานที่ต้องการประสิทธิภาพสูง ควรใช้ ETL tools, message broker หรือเครื่องมือเฉพาะทางแทน
  2. แอปพลิเคชันที่มี UI ซับซ้อน ควรสร้างแอปเล็กๆ หรือระบบโมดูลาร์พร้อม logging, testing, documentation
  3. สถานการณ์ที่ต้องการบำรุงรักษาระยะยาว โปรแกรมที่คอมไพล์อาจเสถียรกว่า ควรใช้ task schedulers หรือ workflow managers เช่น CRON, Airflow, AWS Lambda/GCP Functions

วิธีเขียนสคริปต์ที่มีประสิทธิภาพ

นี่คือกระบวนการที่ผมใช้ หลังจากนี้เราจะดูตัวอย่างสคริปต์ในภาษาต่างๆ เพื่อฝึกปฏิบัติจริง

  1. กำหนดปัญหา: ก่อนเขียน ให้ระบุปัญหาที่จะแก้ ให้ชัดเจนเกี่ยวกับงานที่จะทำอัตโนมัติและผลลัพธ์ที่คาดหวัง
  2. เลือกภาษาที่เหมาะสม:
    • Bash: เหมาะสำหรับงานระดับระบบ เช่น การจัดการไฟล์หรือเซิร์ฟเวอร์
    • Python: เหมาะสำหรับประมวลผลข้อมูล, web scraping, และอัตโนมัติที่ซับซ้อนกว่า
    • JavaScript: เหมาะสำหรับพัฒนาเว็บและอัตโนมัติบนเบราว์เซอร์
  3. เขียนสคริปต์: ใช้ text editor หรือ IDE ปฏิบัติตาม best practices เช่น ใช้คอมเมนต์ ตั้งชื่อตัวแปรที่มีความหมาย และเขียนโค้ดแบบโมดูลาร์
  4. ทดสอบสคริปต์: ทดสอบในสภาพแวดล้อมที่ควบคุมได้ เพื่อให้แน่ใจว่าทำงานตามที่คาดหวังโดยไม่ก่อให้เกิดข้อผิดพลาด
  5. รันและปรับใช้: รันในสภาพแวดล้อมจริง หากจำเป็น ให้จัดตารางการรันด้วยเครื่องมืออย่าง Cron (สำหรับ Bash) หรือ task schedulers

ตัวอย่างสคริปต์

สมมติว่าคุณมีไฟล์ประมาณ 100 ไฟล์ ชื่อ "book-part-1.pdf", "book-part-2.pdf", ..., "book-part-100.pdf" คุณต้องการเปลี่ยนเครื่องหมายขีด (-) ทั้งหมดในชื่อไฟล์เป็น underscore (_) เนื่องจากเว็บไซต์ที่จะอัปโหลดไม่อนุญาตให้อัปโหลดไฟล์ที่ชื่อมีขีด

นี่คือสคริปต์ 3 ภาษาที่ทำงานเดียวกัน กระบวนการคือ:

  1. ค้นหาไฟล์ทั้งหมดในไดเรกทอรี
  2. ตรวจสอบว่าชื่อไฟล์มีขีด (-) หรือไม่
  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 เหมาะกับอัตโนมัติบนเบราว์เซอร์มากกว่า

วิธีรันสคริปต์เหล่านี้

  1. แทนที่ /path/to/your/folder ด้วยไดเรกทอรีจริงที่เก็บไฟล์
  2. รันในสภาพแวดล้อมที่เหมาะสม:
    • Bash: บันทึกเป็น .sh รันด้วย bash script.sh
    • Python: บันทึกเป็น .py รันด้วย python script.py
    • JavaScript: บันทึกเป็น .js รันด้วย node script.js

สคริปต์แบบทำซ้ำ (Recurring Scripts)

สคริปต์แบบทำซ้ำ 設計มาเพื่อรันเป็นระยะ เช่น ตรวจสอบสถานะระบบรายสัปดาห์ ล้างล็อก หรือดึงข้อมูลอัปเดต มักใช้ task scheduler

วิธีทั่วไป

  1. CRON jobs: ระบบปฏิบัติการส่วนใหญ่รองรับ CRON สำหรับจัดตารางรันสคริปต์
  2. Task queues: เครื่องมืออย่าง Celery (Python), Bull (Node.js), Sidekiq (Ruby) จัดการงานที่จัดตารางได้ยืดหยุ่นกว่า
  3. 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!