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 ต้องมี | เป็น “สัญญา” ไม่ใช่โปรแกรมตัวจริง |
dash | shell เล็ก เร็ว ทำตาม 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 — บน Ubuntushคือ 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, และสามวิธีรันสคริปต์ที่ให้ผลต่างกัน