แนะนำ Bash Command สำหรับ Developer มือใหม่

Originally published at https://somprasongd.work/blog/server/baisc-bash

แม้ว่า GUI จะช่วยให้การเขียนโค้ดง่ายขึ้น แต่เมื่อคุณเริ่มทำงานจริงโดยเฉพาะกับระบบ backend, deployment, หรือ CI/CD — การใช้ Terminal และ Bash Command กลายเป็นทักษะที่ขาดไม่ได้

บทความนี้ออกแบบมาสำหรับ developer มือใหม่ ที่ไม่คุ้นกับการใช้ command line โดยใช้โปรเจกต์ Go สมมติชื่อ myapp เป็นตัวอย่าง

รายชื่อคำสั่งที่ควรรู้จัก

พื้นฐานและจัดการไฟล์

  • pwd, ls, cd, touch, mkdir, rm, cat, less, head, tail, echo

ค้นหาและแก้ไข

  • grep, find, nano, vim

รันโปรเจกต์ / ดู process

  • go run, go build, ps, top, kill

จัดการ Git

  • git clone, git status, git log

ประมวลผลข้อความ

  • awk, sed, jq

การเรียก API และ Network เบื้องต้น

  • curl, ping, wget, netstat, lsof

จัดการ Environment Variable

  • export, .env, source, $VAR

เขียน Shell Script

  • #!/bin/bash, ตัวแปร, เงื่อนไข (if, loop)

สมมติฐาน: โปรเจกต์ Go ชื่อ myapp

git clone https://github.com/yourusername/myapp.git
cd myapp

1. พื้นฐานและจัดการไฟล์

pwd – แสดง path ปัจจุบัน

pwd

เช่น:

/Users/somprasong/projects/myapp

ls – แสดงรายการไฟล์

ls                        # แสดงรายการไฟล์และโฟลเดอร์ในไดเรกทอรีปัจจุบัน (แบบสั้น)
ls -lah                   # แสดงรายการไฟล์ทั้งหมด (รวมไฟล์ที่ขึ้นต้นด้วย .)
                          # -l : แสดงรายละเอียด เช่น permission, owner, size, date
                          # -a : แสดงไฟล์ทั้งหมด รวมถึงไฟล์ซ่อน (ที่ขึ้นต้นด้วย .)
                          # -h : แสดงขนาดไฟล์ให้อ่านง่าย (เช่น KB, MB)

cd – เปลี่ยนโฟลเดอร์

cd cmd         # เปลี่ยนไปยังโฟลเดอร์ย่อยชื่อ cmd (ภายใต้ไดเรกทอรีปัจจุบัน)

cd ..          # ย้อนกลับไปยังโฟลเดอร์แม่ (parent directory)

cd -           # กลับไปยังไดเรกทอรีก่อนหน้าที่เคยอยู่ (toggle ไป toggle มา)
               # ตัวอย่าง: อยู่ใน /project/cmd แล้ว cd .. ไป /project
               # หากรัน cd - จะกลับไป /project/cmd อีกครั้ง

touch – สร้างไฟล์เปล่า

touch config.yaml         # สร้างไฟล์เปล่าชื่อ config.yaml
                          # หากไฟล์นี้มีอยู่แล้ว จะไม่ทำอะไร (แต่จะอัปเดตเวลาการเข้าถึง)

mkdir – สร้างโฟลเดอร์

mkdir logs                   # สร้างโฟลเดอร์ชื่อ logs (ถ้ายังไม่มีอยู่)
mkdir -p logs/2025/july      # สร้างโฟลเดอร์ซ้อนกันหลายชั้นในครั้งเดียว
                             # -p คือให้สร้างโฟลเดอร์ parent (2025) โดยอัตโนมัติหากยังไม่มี

rm – ลบไฟล์หรือโฟลเดอร์

rm config.yaml          # ลบไฟล์ชื่อ config.yaml (เฉพาะไฟล์เดียว)
rm -rf logs/            # ลบโฟลเดอร์ logs และทุกไฟล์/โฟลเดอร์ย่อยภายใน
                        # -r คือ recursive (ลบทั้งโฟลเดอร์)
                        # -f คือ force (ไม่ถามยืนยัน)

คำสั่ง rm -rf ต้องใช้อย่างระมัดระวัง เพราะจะลบทุกอย่างโดยไม่ถาม

2. คำสั่งอ่าน / ค้น / แก้ไขไฟล์

cat – อ่านไฟล์ทั้งหมด

cat README.md

less – อ่านไฟล์แบบ scroll

less README.md

กด q เพื่อออก

head และ tail – ดูต้นหรือท้ายไฟล์

head main.go        # 10 บรรทัดแรก
tail main.go        # 10 บรรทัดสุดท้าย

echo – แสดงข้อความ / ตัวแปร

echo "Hello, Go Developer"         # แสดงข้อความ
echo $HOME                         # แสดงค่าตัวแปร environment
echo "Build status: $STATUS"       # แสดงค่าตัวแปรที่เรากำหนดเอง

บันทึกค่าไปไฟล์

echo "PORT=8080" > .env            # สร้างไฟล์ .env พร้อมกำหนดค่า
echo "DEBUG=true" >> .env          # เพิ่มบรรทัดใหม่ต่อท้าย

3. การค้นหาไฟล์ / ข้อความ

grep – ค้นหาคำในไฟล์

grep "func main" main.go
# ค้นหาข้อความ "func main" ในไฟล์ main.go
# ใช้เพื่อหา function entry point ในภาษา Go

grep -i "http" *.go
# ค้นคำว่า "http" (ไม่สนว่าเป็นตัวพิมพ์ใหญ่หรือเล็ก) ในทุกไฟล์ .go
# มีประโยชน์เวลาอยากหาว่าไฟล์ไหนเรียกใช้งาน HTTP client หรือ HTTP handler

find – ค้นหาไฟล์

find . -name "*.go"
# ค้นหาไฟล์ทั้งหมดที่ลงท้ายด้วย .go จาก path ปัจจุบันและทุกโฟลเดอร์ย่อย
# ใช้แทนการ grep ทั้ง project หรือเตรียมทำ build/check ทั่วโปรเจกต์

find . -type f -name "*.yaml"
# ค้นหาไฟล์ (`-type f`) ที่ชื่อจบด้วย .yaml เท่านั้น
# เหมาะสำหรับหา config ที่เก็บในหลายๆ โฟลเดอร์ เช่น `config/dev.yaml`, `config/test/app.yaml`

4. แก้ไขไฟล์จาก terminal

nano – editor แบบง่าย

nano config.yaml

เปิดไฟล์ config.yaml ขึ้นมาแก้ไขด้วย editor nano ซึ่งใช้งานง่าย เหมาะสำหรับมือใหม่

วิธีบันทึกและออกจาก nano:

  • กด Ctrl + O เพื่อบันทึกไฟล์ (O = Output)
    • กด Enter ยืนยันชื่อไฟล์
  • กด Ctrl + X เพื่อออกจาก nano (X = Exit)

vim – editor แบบมืออาชีพ

vim main.go

เปิดไฟล์ main.go ด้วย vim ซึ่งเป็น editor ทรงพลังและเร็วมาก เหมาะกับผู้ที่ใช้ terminal เป็นประจำ

โหมดพื้นฐานใน vim:

  • Normal mode – สำหรับสั่งงาน (เปิดโปรแกรมจะเริ่มที่โหมดนี้)
  • Insert mode – สำหรับพิมพ์ข้อความ (i เพื่อเข้า insert)
  • Command mode – สำหรับรันคำสั่ง (: เพื่อเข้า)

วิธีบันทึกและออกจาก vim:

  1. กด Esc เพื่อออกจากโหมด insert (กลับไปที่ normal mode)
  2. พิมพ์ :w แล้วกด Enter → บันทึกไฟล์ (write)
  3. พิมพ์ :q แล้วกด Enter → ออกจาก vim (quit)
  4. หรือใช้รวมกัน :wq → บันทึกและออก
  5. ถ้าไม่อยากบันทึกการเปลี่ยนแปลง: พิมพ์ :q! → ออกโดยไม่บันทึก

ถ้าคุณเพิ่งเริ่มใช้ terminal แนะนำเริ่มจาก nano ก่อน แล้วค่อยเรียนรู้ vim เมื่อเริ่มคุ้นเคยมากขึ้น

5. รันโปรเจกต์ Go และจัดการ process

go run – รันโปรแกรม

go run main.go

go build – คอมไพล์แอป

go build -o myapp          # คอมไพล์ไฟล์ Go ทั้งโปรเจกต์เป็นไฟล์ไบนารีชื่อ myapp
                          # -o ระบุชื่อไฟล์เอาต์พุตเอง (output)

./myapp                    # รันไฟล์ไบนารี myapp ที่เพิ่งคอมไพล์ออกมา

ps, top, kill – ดูและจัดการ process

ps aux | grep myapp
# ดูรายชื่อ process ทั้งหมดในระบบ (ps aux)
# และกรองแสดงเฉพาะบรรทัดที่มีคำว่า "myapp"
# เพื่อเช็คว่าโปรแกรมชื่อ myapp กำลังรันอยู่หรือไม่ พร้อมแสดง PID (Process ID)

top
# แสดงสถานะ process แบบ real-time
# แสดงการใช้งาน CPU, Memory และ process ที่กำลังทำงานมากที่สุด
# กด 'q' เพื่อออกจากหน้าจอ top

kill -9 <pid>
# สั่งให้ระบบหยุด process โดยใช้ PID ที่ต้องการ
# -9 คือส่งสัญญาณ SIGKILL เพื่อบังคับหยุด proce

6. ใช้ Git เบื้องต้น

git status
# แสดงสถานะปัจจุบันของ repository
# แจ้งไฟล์ที่มีการเปลี่ยนแปลง ยังไม่ได้ commit หรือไฟล์ที่ยังไม่ถูก track

git add <file>
# เพิ่มไฟล์เข้าสู่ staging area เพื่อเตรียม commit
# เช่น git add main.go

git commit -m "ข้อความบรรยาย"
# บันทึก snapshot ของไฟล์ที่อยู่ใน staging area พร้อมข้อความอธิบาย

git log --oneline
# แสดงประวัติ commit แบบย่อ สั้นๆ เหมาะสำหรับดูภาพรวม

git branch
# แสดงรายการสาขา (branches) ใน repository ปัจจุบัน

git checkout <branch-name>
# สลับไปยัง branch ที่ระบุ

git pull
# ดึงการเปลี่ยนแปลงล่าสุดจาก remote repository มารวมกับ branch ปัจจุบัน

git push
# ส่ง commit ที่ทำไปยัง remote repository

git clone <url>
# คัดลอก (clone) repository จาก remote มายังเครื่องเรา

7. การจัดการ Environment Variables

export – กำหนดตัวแปรใน session

export PORT=8080
# กำหนดตัวแปร PORT ให้มีค่าเป็น 8080 และ export ไปยัง environment
# ทำให้โปรแกรมหรือ shell อื่นสามารถเข้าถึงค่าตัวแปรนี้ได้

export DEBUG=true
# กำหนดตัวแปร DEBUG ให้มีค่า true

เรียกใช้ตัวแปร

echo $PORT
# แสดงค่าของตัวแปร PORT
# ผลลัพธ์: 8080

การโหลดค่าตัวแปรจากไฟล์ .env

source .env
# อ่านและโหลดค่าตัวแปรจากไฟล์ .env เข้าสู่ environment
# ไฟล์ .env มักใช้เก็บค่าคอนฟิก เช่น PORT=3000, DB_URL=...

หมายเหตุ: ไฟล์ .env ควรอยู่ในรูปแบบ KEY=value ต่อบรรทัด เช่น

PORT=3000
DEBUG=false

ใช้ตัวแปรร่วมกับคำสั่งอื่น

go run main.go
# ใช้งานโปรแกรม Go โดยอ้างอิงค่าจาก $PORT หรือ $DEBUG ภายในโค้ดได้
# เช่น os.Getenv("PORT") ในภาษา Go

ลบตัวแปรออกจาก environment

unset PORT
# ลบตัวแปร PORT ออกจาก environment

การใช้ environment variables เป็นเรื่องพื้นฐานที่สำคัญมากในงาน dev เพราะช่วยให้แยก config ออกจาก code และควบคุมการทำงานได้ง่ายในแต่ละ environment (dev, staging, prod)

8. คำสั่ง Network ที่ควรรู้

ping – ตรวจสอบว่า host online หรือไม่

ping google.com
# ส่ง ICMP request ไปยัง google.com แบบไม่จำกัดจำนวนครั้ง (ต้องกด Ctrl+C เพื่อหยุดเอง)

ตัวเลือก (option) ที่นิยมใช้บ่อย

ส่งจำนวนจำกัด (c)

ping -c 4 google.com
# ส่ง ping ไปยัง google.com จำนวน 4 ครั้ง แล้วหยุดอัตโนมัติ

กำหนดเวลาระหว่างการ ping (i)

ping -i 0.5 google.com
# ส่ง ping ทุก ๆ 0.5 วินาที (ค่า default คือ 1 วินาที)

แสดงเวลารวม (D)

ping -D -c 2 google.com
# แสดง timestamp ของแต่ละ reply (ใช้ดู latency แบบมีเวลาประกอบ)

ตรวจสอบด้วย IP โดยตรง

ping 8.8.8.8
# ใช้ ping ด้วย IP โดยไม่ผ่าน DNS lookup

ใช้ IPv6 (6)

ping -6 google.com
# ใช้ IPv6 แทน IPv4 ในการ ping

หมายเหตุสำหรับการใช้ในระบบ Linux/macOS:

  • ping บน macOS มี option บางตัวที่ต่างจาก Linux เล็กน้อย เช่น t บน macOS คือจำนวนครั้ง แต่บน Linux คือ TTL (time to live)
  • ควรตรวจสอบ man ping เพื่อดู option ทั้งหมดในระบบของคุณ

curl – เรียก API

curl http://localhost:8080/health
# ส่ง HTTP GET request ไปยัง endpoint /health บน localhost port 8080

ตัวเลือก (option) ที่นิยมใช้บ่อย

แสดง header ของ response (i)

curl -i http://localhost:8080/health
# แสดง HTTP response header ด้วย

แสดงเฉพาะ HTTP status code (o /dev/null -w "%{http_code}" -s)

curl -o /dev/null -s -w "%{http_code}n" http://localhost:8080/health
# ใช้ตรวจสอบว่า endpoint ตอบกลับด้วย status code อะไร (เช่น 200, 404)

ส่งข้อมูลแบบ JSON (X POST -H "Content-Type: application/json" -d)

curl -X POST http://localhost:8080/api 
  -H "Content-Type: application/json" 
  -d '{"username": "admin", "password": "1234"}'
# ส่ง HTTP POST request พร้อม payload JSON

อ่านค่า header ที่ส่งกลับมา (I)

curl -I http://localhost:8080/
# ส่ง HTTP HEAD request (ไม่โหลดเนื้อหา) เพื่อดู header เท่านั้น

เก็บผลลัพธ์ลงไฟล์ (o)

curl -o response.json http://localhost:8080/api/data
# บันทึกผลลัพธ์ของ HTTP response ลงไฟล์ response.json

ใช้กับไฟล์ .env ที่มี token หรือ env var

curl -H "Authorization: Bearer $API_TOKEN" http://localhost:8080/api
# ส่ง header พร้อม token จากตัวแปร environment

ใช้ curl ทดสอบ REST API เบื้องต้น

curl -X GET http://localhost:8080/users
curl -X POST http://localhost:8080/users -d '{"name": "go dev"}' -H "Content-Type: application/json"

คำสั่ง curl เหมาะสำหรับ:

  • ทดสอบ health check
  • ตรวจสอบ endpoint ในระบบ microservices
  • Debug API เบื้องต้น
  • ใช้ร่วมกับ jq เพื่อจัดรูปแบบ JSON

wget – ดาวน์โหลดไฟล์

wget http://example.com/file.txt
# ดาวน์โหลดไฟล์จาก URL ไปยังไฟล์ในเครื่อง

ตัวเลือก (option) ที่ใช้บ่อย

1. O <filename> – เปลี่ยนชื่อไฟล์ที่บันทึก

wget -O myfile.txt http://example.com/file.txt
# ดาวน์โหลดแล้วเซฟเป็นชื่อ myfile.txt

2. c – ดาวน์โหลดต่อ (resume) หากไฟล์ยังไม่เสร็จ

wget -c http://example.com/largefile.zip
# หากหลุดระหว่างโหลด สามารถใช้ -c โหลดต่อจากจุดเดิมได้

3. -limit-rate=200k – จำกัดความเร็วในการดาวน์โหลด

wget --limit-rate=200k http://example.com/file.txt
# ดาวน์โหลดโดยจำกัดความเร็วที่ 200KB/s

4. -no-check-certificate – ข้ามการตรวจสอบ SSL (ใช้กับ HTTPS)

wget --no-check-certificate https://example.com/file.txt
# ใช้กรณี certificate ไม่ valid เช่น เซิร์ฟเวอร์ dev

5. -user=<username> --password=<password> – สำหรับเว็บไซต์ที่ต้อง login

wget --user=admin --password=secret http://example.com/protected.zip
# ใช้เมื่อจำเป็นต้องใส่ username/password

6. r – ดาวน์โหลดแบบ recursive (ทั้ง directory)

wget -r http://example.com/files/
# ดาวน์โหลดทั้ง directory และไฟล์ย่อยทั้งหมด

7. -no-parent – ไม่ขึ้นไปโหลด path ด้านบน

bash
Copy code
wget -r --no-parent http://example.com/files/
# ดาวน์โหลดเฉพาะไฟล์ภายใน path นั้น ไม่ย้อนกลับขึ้นไป directory ข้างบน

ตัวอย่างการใช้งานร่วมกัน

wget -c -O backup.zip http://example.com/backup.zip
# ดาวน์โหลดไฟล์ backup.zip และสามารถ resume ได้หากหลุด

netstat – ดูว่าโปรแกรมไหนเปิดพอร์ต

netstat -tulnp

ความหมายของแต่ละ option:

  • t = แสดงเฉพาะ TCP
  • u = แสดงเฉพาะ UDP
  • l = แสดงเฉพาะที่อยู่ในสถานะ “listening” (รอฟังการเชื่อมต่อ)
  • n = แสดง IP และพอร์ตเป็นตัวเลข (ไม่แปลงเป็นชื่อ)
  • p = แสดงโปรเซส (PID) และชื่อโปรแกรมที่ใช้พอร์ตนั้น (ต้องใช้ sudo ในบางระบบ)

ตัวอย่างผลลัพธ์:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1234/nginx
udp        0      0 0.0.0.0:123             0.0.0.0:*

lsof – ดูว่าใครใช้พอร์ต

lsof -i :8080  
# i :8080 หมายถึงให้แสดงเฉพาะโปรเซสที่เปิดใช้งานพอร์ต 8080

ตัวอย่างผลลัพธ์:

COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
myapp    1234 user   10u  IPv4  12345      0t0  TCP *:http-alt (LISTEN)

คุณสามารถดูว่าแอปอะไรใช้งานพอร์ต และจะนำ PID (1234 ในตัวอย่าง) ไปใช้กับ kill ได้เช่น

kill -9 1234

9. ประมวลผลข้อความ

awk – ดึง column จากข้อความ

awk '{print $1}' access.log     # ดึงข้อมูลคอลัมน์แรกจากไฟล์

# ดึงคอลัมน์ที่ 7 (เช่น URL ที่เรียก):
awk '{print $7}' access.log

# ดึงหลายคอลัมน์พร้อมกัน:
awk '{print $1, $7}' access.log

# ใช้กับ pipe (เช่น log จากคำสั่งอื่น):
cat access.log | awk '{print $1}'

ตัวอย่างเช่น

ไฟล์ access.log มีข้อมูล

192.168.1.1 - - [21/Jul/2025:12:00:00] "GET /index.html HTTP/1.1" 200 1234
127.0.0.1 - - [21/Jul/2025:12:01:00] "POST /login HTTP/1.1" 302 0

คำสั่ง awk '{print $1}' access.log จะได้ผลลัพธ์เป็น

192.168.1.1
127.0.0.1

sed – แก้ข้อความในไฟล์

sed 's/localhost/127.0.0.1/g' config.yaml

# แทนที่คำว่า localhost ด้วย 127.0.0.1
# 's/localhost/127.0.0.1/g' =
#   s = substitute (คำสั่งแทนที่)
#   localhost = คำที่ต้องการค้นหา
#   127.0.0.1 = คำที่ใช้แทน
#   g = global คือ แทนที่ทุกจุดที่เจอในแต่ละบรรทัด

# config.yaml = ชื่อไฟล์ต้นทาง

คำสั่งนี้จะแสดงผลลัพธ์ใหม่ที่มีการแทนที่ localhost ด้วย 127.0.0.1 ทุกแห่งในแต่ละบรรทัด แต่ยังไม่บันทึกลงไฟล์

ถ้าต้องการเขียนกลับลงไฟล์

ใช้ option -i เพื่อแก้ไขในไฟล์จริง:

sed -i 's/localhost/127.0.0.1/g' config.yaml

หมายเหตุ: บน macOS อาจต้องใช้ -i ''

sed -i '' 's/localhost/127.0.0.1/g' config.yaml

jq – แก้ไข JSON

curl -s http://localhost:8080/status | jq '.'

# jq '.'    แสดง JSON ทั้งก้อนแบบสวยงาม (pretty print)

# ตัวอย่างเพิ่มเติมของ jq
# jq '.status'  ดึงค่าจาก key status

# jq '.data.name'   ดึงค่าจาก nested key เช่น .data.name

# `jq '.items[].id'` ดึงค่าของฟิลด์ id จากทุก element ที่อยู่ใน array items ของ JSON

# jq '.users[] | select(.active == true)'
# .users[] วนลูปผ่านแต่ละ element ใน array ชื่อ users
# select(.active == true) กรอง (filter) เฉพาะ element ที่มี field active เท่ากับ true

10. เขียน Shell Script เบื้องต้น

ไฟล์: build.sh

#!/bin/bash

echo "Building myapp..."
go build -o myapp

if [ $? -eq 0 ]; then
  echo "✅ Build success"
else
  echo "❌ Build failed"
fi

ให้สิทธิ์รัน:

chmod +x build.sh
./build.sh

11. เสริม productivity

history                # ดูคำสั่งย้อนหลัง
!!                     # รันคำสั่งล่าสุด
alias gs="git status"  # สร้าง shortcut คำสั่ง

สรุป

Developer มือใหม่ไม่จำเป็นต้องจำคำสั่งทั้งหมดในคราวเดียว แต่ควรเริ่มจากคำสั่งที่ ใช้กับงานจริงในโปรเจกต์ตัวเอง เช่น แก้ config, รันแอป, แสดงค่าตัวแปร, แก้ .env, หรือดู log จาก production

เมื่อคุ้นมือแล้ว คุณจะเริ่มใช้ bash เป็นเครื่องมือสร้างระบบ build, deploy, หรือ monitoring script ที่ยืดหยุ่นและควบคุมได้เอง 100%

Similar Posts