Bash คืออะไร ทำไมต้องเขียนสคริปต์เชลล์เป็น



คุณคงเคยเจอคู่มือติดตั้งที่บอกว่า “ก๊อปบล็อกนี้ไปวางในเทอร์มินัล” แล้วมันก็มี 15 บรรทัดรวด — สร้างโฟลเดอร์ ดาวน์โหลดไฟล์ แตกไฟล์ ตั้งสิทธิ์ รีสตาร์ตบริการ นั่นแหละคือ สคริปต์ Bash แค่ยังไม่ได้เซฟเป็นไฟล์

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

terminal, shell, bash — คนละอย่างกัน

สามคำนี้ถูกใช้ปนกันจนงง แยกให้ชัดตั้งแต่ตอนนี้

┌─ terminal — โปรแกรมหน้าต่าง (GNOME Terminal, Windows Terminal, iTerm)
│    หน้าที่: รับคีย์ที่คุณพิมพ์ แล้ววาดตัวอักษรบนจอ
│
│    ┌─ shell — ตัวแปลคำสั่ง (bash, zsh, fish, dash)
│    │    หน้าที่: อ่านบรรทัดที่พิมพ์ แล้วสั่งให้โปรแกรมทำงาน
│    │            จัดการตัวแปร, ต่อท่อ (|), วนลูป
│    └─
└─
  • terminal (เทอร์มินัล) — หน้าต่างสีดำ ๆ เป็นแค่ “จอ + คีย์บอร์ด” ไม่รู้จักคำสั่งอะไรเลย มันแค่ส่งสิ่งที่คุณพิมพ์ต่อให้ shell แล้วเอาผลลัพธ์มาวาด
  • shell (เชลล์) — โปรแกรมที่อยู่ข้างในเทอร์มินัล คอยอ่านบรรทัดคำสั่ง ตีความ ls -l, ขยาย *.txt, ต่อท่อ |, วนลูป มีหลายยี่ห้อ
  • bash (แบช) — ชื่อของ shell ยี่ห้อหนึ่ง ย่อจาก Bourne Again SHell เป็นค่าเริ่มต้นของ Ubuntu และ Linux ส่วนใหญ่

เวลาเราพูดว่า “เขียน bash script” หมายถึงเขียนไฟล์คำสั่งให้ shell ชื่อ bash อ่านและทำงานตาม

sh, dash, bash, zsh ต่างกันยังไง

shellคืออะไรเจอที่ไหน
shมาตรฐาน POSIX — ชุดคำสั่งขั้นต่ำที่ทุก Unix ต้องมีเป็น “สัญญา” ไม่ใช่โปรแกรมตัวจริง
dashshell เล็ก เร็ว ทำตาม POSIX เป๊ะUbuntu: /bin/sh ชี้มาที่ dash
bashต่อยอดจาก sh เพิ่ม array, [[ ]], {1..10}, ฟังก์ชันดี ๆ/bin/bash — ค่าเริ่มต้นของ Ubuntu
zshเหมือน bash แต่ autocomplete เทพกว่า ปรับแต่งสวยค่าเริ่มต้นของ macOS รุ่นใหม่
fishเป็นมิตรกับมือใหม่ แต่ syntax ไม่เข้ากับ bashต้องติดตั้งเอง

ประเด็นที่กัดมือใหม่บ่อยที่สุด: บน Ubuntu ถ้าคุณเขียน #!/bin/sh ที่หัวสคริปต์ มันจะรันด้วย dash ไม่ใช่ bash — พวก [[ ]], arr=(a b c), {1..5} จะพังทันที ซีรีส์นี้ใช้ #!/usr/bin/env bash เสมอ เพื่อให้ได้ bash จริง ๆ

interactive shell กับ script ต่างกันตรงไหน

  • interactive — คุณนั่งพิมพ์ทีละบรรทัด เห็นผลทันที มี prompt กะพริบรอ เหมาะกับสำรวจ ลองผิดลองถูก
  • script — เขียนคำสั่งหลายบรรทัดใส่ไฟล์ แล้วสั่งรันรวดเดียว ไม่มีใครนั่งเฝ้า เหมาะกับงานซ้ำ งานที่ต้องทำเป๊ะทุกครั้ง

ภาษาเดียวกัน แต่พอเป็นสคริปต์เราต้องเข้มงวดกว่ามาก เพราะไม่มีคนคอยดูว่ามันทำถูกไหม บทเรื่อง set -euo pipefail (บทที่ 30) จะพูดเรื่องนี้ยาว

เขียน Bash เป็นแล้วได้อะไร

  • กาวเชื่อมเครื่องมือ — งานจริงมักเป็น “รัน A เอาผลไปใส่ B ถ้าสำเร็จค่อยทำ C” bash เกิดมาเพื่อสิ่งนี้
  • ตั้งเครื่องใหม่ในคำสั่งเดียว — สคริปต์ provisioning ติดตั้งทุกอย่างที่ต้องใช้
  • CI/CD — ขั้นตอนใน GitHub Actions, GitLab CI ส่วนใหญ่คือ bash
  • Deploy — build, อัปโหลด, รีสตาร์ต, เช็ก health — หนึ่งสคริปต์
  • งานประจำ — สำรองข้อมูล, หมุน log, ล้างไฟล์เก่า, สรุปรายงานจาก log
  • แก้ไฟล์ config หลายเครื่องพร้อมกัน — วน loop ผ่าน ssh

ทักษะนี้ย้ายข้ามงานได้หมด ไม่ว่าคุณจะเขียนแอปด้วยภาษาอะไร สุดท้ายต้องมีสคริปต์ห่อมันอยู่

เมื่อไหร่ *ไม่* ควรใช้ Bash

Bash เก่งเรื่องเรียกโปรแกรมและต่อท่อ แต่พออะไรเริ่มซับซ้อนให้ย้ายภาษา

  • ต้องใช้ โครงสร้างข้อมูล ซับซ้อน (list ซ้อน dict, JSON ลึก ๆ) → Python
  • ต้องคำนวณ ทศนิยม / คณิตศาสตร์จริงจัง → Bash ทำจำนวนเต็มอย่างเดียว
  • ประมวลผล ข้อมูลขนาดใหญ่ ที่ต้องเร็ว → awk, Python, หรือภาษาคอมไพล์
  • โค้ดยาวเกิน ~150–200 บรรทัด และมีตรรกะเยอะ → ภาษาอื่นอ่านและเทสง่ายกว่า

กฎง่าย ๆ: ถ้าสคริปต์เริ่มมี array ซ้อน array หรือคุณคิดถึง “คลาส” — ถึงเวลาเปลี่ยนภาษาแล้ว

ตรวจว่าคุณมี bash เวอร์ชันอะไร

bash --version
echo "$BASH_VERSION"
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
5.1.16(1)-release
  • Ubuntu 22.04 มากับ bash 5.1, 24.04 มากับ 5.2 — ใหม่พอสำหรับทุกอย่างในซีรีส์นี้
  • macOS ยังมากับ bash 3.2 (ปี 2007!) เพราะเรื่องไลเซนส์ — associative array (บทที่ 21) และ ${var^^} ใช้ไม่ได้ ถ้าใช้ Mac ให้ brew install bash
  • เช็กเวอร์ชันขั้นต่ำในสคริปต์ได้ด้วย ${BASH_VERSINFO[0]} (เลขเมเจอร์)

เรื่องที่คนมักพลาด

  • คิดว่า terminal กับ shell เป็นสิ่งเดียวกัน — terminal คือหน้าต่าง, shell คือโปรแกรมข้างใน คุณเปลี่ยน shell ได้โดยไม่เปลี่ยน terminal
  • เขียน #!/bin/sh แต่ใช้ฟีเจอร์ bash — บน Ubuntu sh คือ dash สคริปต์จะพังแบบงง ๆ เช่น [[: not found ใส่ #!/usr/bin/env bash เสมอ
  • ก๊อปสคริปต์จากอินเทอร์เน็ตมารันทั้งดุ้นโดยไม่อ่าน — โดยเฉพาะที่มี sudo หรือ rm อ่านให้เข้าใจทุกบรรทัดก่อน
  • ใช้ bash กับงานที่ควรใช้ Python — พอเจอ JSON ซ้อนลึกหรือคณิตศาสตร์ทศนิยม อย่าฝืน
  • ทดสอบบน Mac แล้วเอาไปรันบน Linux server (หรือกลับกัน) — bash 3.2 กับ 5.x ต่างกันเยอะ ทดสอบบนเวอร์ชันเดียวกับที่จะรันจริง

สรุป

  • terminal = หน้าต่าง, shell = ตัวแปลคำสั่งข้างใน, bash = ชื่อยี่ห้อ shell ที่ Ubuntu ใช้
  • บน Ubuntu #!/bin/sh = dash (POSIX) ไม่ใช่ bash — ใช้ #!/usr/bin/env bash เพื่อได้ bash จริง
  • interactive (นั่งพิมพ์) กับ script (รันรวดเดียว) ใช้ภาษาเดียวกัน แต่สคริปต์ต้องเข้มงวดกว่า
  • Bash เก่งเรื่องเป็น “กาว” เชื่อมโปรแกรม — CI, deploy, ตั้งเครื่อง, งานประจำ
  • ย้ายไปภาษาอื่นเมื่อ: โครงสร้างข้อมูลซับซ้อน, ทศนิยม, ข้อมูลใหญ่, โค้ดยาวเกิน ~150 บรรทัด
  • เช็กเวอร์ชันด้วย bash --version — Mac ยังเป็น 3.2 ระวังฟีเจอร์ใหม่ใช้ไม่ได้

บทถัดไปเราจะลงมือเขียนสคริปต์แรก — shebang, chmod +x, และสามวิธีรันสคริปต์ที่ให้ผลต่างกัน