從 Shell 腳本開始:用 Bash 自動化日常任務實戰指南

身為開發者,我們每天都在重複一些瑣碎又固定的動作:備份資料庫、壓縮日誌、上傳檔案、重啟服務、清一清暫存目錄……這些事單做一次不難,難的是「每天、每次都手動來一遍」。如果你已經熟悉 Linux 的基本指令(ls、cd、cp、chmod 等),那麼下一步最值得投資的技能,就是把這些指令串成一支可以一鍵執行的 Shell 腳本。今天就帶你從零寫出人生第一支自動化腳本,並實戰一個 WordPress 網站的備份流程。

一、什麼是 Shell 腳本,為什麼要學

簡單說,Shell 腳本就是把一串終端機指令寫進一個純文字檔,讓系統照順序自動執行。它的價值在於:把「人腦記憶的步驟」變成「電腦保證不漏的步驟」。好處有三:

  • 不靠記憶:流程寫下來,三個月後照跑不誤。
  • 不會手抖:人工輸入 20 個指令總有打錯的時候,腳本每一次都精準一致。
  • 可以排程:搭配 crontab,讓它在凌晨三點自動幫你做事,你睡覺它加班。

二、第一支腳本:從 hello 到可執行檔

步驟 1:建立腳本檔,並在開頭寫上 shebang(指定用哪個直譯器執行)。

#!/usr/bin/env bash
echo "Hello, Shell!"

步驟 2:存成 hello.sh 後,賦予執行權限。

chmod +x hello.sh

步驟 3:執行它。

./hello.sh

重點:#!/usr/bin/env bash 這行不是註解,而是告訴系統「請用 bash 來跑我」,少了它在某些環境會無法直接執行。

三、變數、參數與讀取輸入

腳本真正的威力來自「會變的資料」。Bash 用 $ 取用變數,$1$2 則代表傳入的第一、第二個參數:

#!/usr/bin/env bash
NAME=$1
echo "你好,$NAME"
# 執行:./greet.sh 雪海涛  →  輸出:你好,雪海涛

也可以用 read 在執行中向使用者要資料;或是用 $(命令) 把指令結果存進變數,例如 TODAY=$(date +%Y%m%d) 就能拿到當天日期當檔名。

四、條件判斷與迴圈:讓腳本會思考

實用的腳本幾乎都帶點邏輯。最常見的判斷是「檔案是否存在」:

if [ -f "config.php" ]; then
  echo "設定檔存在,開始部署"
else
  echo "缺少 config.php,請先建立"
  exit 1
fi

迴圈則適合批次處理,例如把某目錄下所有 .log 壓成一份壓縮檔:

for f in *.log; do
  tar -czf logs_$(date +%Y%m%d).tar.gz "$f"
done

五、實戰:一鍵備份 WordPress 網站

把前面所學組合起來,寫一支備份腳本:壓縮網站目錄 + 匯出 MySQL 資料庫 + 加日期命名。這對經營 13zn.com 這類 PHP+MySQL 網站的人特別實用。

#!/usr/bin/env bash
DATE=$(date +%Y%m%d_%H%M)
BACKUP_DIR="/backup"
WWW_DIR="/www"
DB_NAME="my3692032114"
DB_USER="my3692032114"
DB_PASS="ed920817"

# 壓縮網站程式
tar -czf "$BACKUP_DIR/www_$DATE.tar.gz" -C "$WWW_DIR" .
# 匯出資料庫
mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$BACKUP_DIR/db_$DATE.sql"
echo "備份完成:$DATE"

特別注意:把資料庫密碼直接寫在腳本裡有外洩風險,正式環境建議改用 ~/.my.cnf 或環境變數讀取,並把備份目錄權限設為 600。

六、排程自動跑:crontab 讓腳本自律

寫好腳本後,用 crontab -e 加入一行,就能讓它每天凌晨自動執行:

# 每日 03:00 自動備份
0 3 * * * /path/to/backup.sh >> /backup/cron.log 2>&1

五個欄位分別是「分 時 日 月 週」,* 表示「每」。這樣你睡覺的時候,備份已經默默完成。

從一支 echo 腳本到自動備份整個網站,你已經走完了 Shell 自動化的核心路徑。重點回顧:shebang 不能漏、變數用 $、邏輯用 if/for、敏感資訊別硬寫、最後交給 crontab 排程。把重複的事交給腳本,你才能把時間留給真正需要思考的工作。

互動話題:你目前最想自動化的是哪一件瑣事?是部署、備份,還是某個每天手動跑的報表?留言告訴我,我們一起把它寫成腳本。