01. Bash 是什麼?
認識 Bash、Shell 與它在 Linux / Unix 系統中的角色。
什麼是 Bash?
Bash 是常見的 Unix/Linux Shell,也常作為系統預設命令列環境。你可以直接執行指令,也可以撰寫 Shell Script 自動化工作。
為什麼要學 Bash?
它很適合做系統管理、部署腳本、批次處理、日誌分析、檔案操作與 CI/CD 流程,是 Linux 生態非常核心的技能。
🧠 指令式思維
快速與系統互動,比圖形介面更高效。
快速與系統互動,比圖形介面更高效。
⚙️ 自動化工作
將重複手動流程改為腳本執行。
將重複手動流程改為腳本執行。
📦 DevOps 必備
在伺服器、容器與部署場景中極常用。
在伺服器、容器與部署場景中極常用。
🔗 可整合多種工具
能搭配 grep、sed、awk、find、tar 等命令。
能搭配 grep、sed、awk、find、tar 等命令。
第一個 Bash 指令
bash --version
echo "Hello, Bash!"
pwd
GNU bash, version 5.x
Hello, Bash!
/home/user
提示:本頁的終端輸出為教學示意,重點是幫助你理解「輸入命令」與「輸出結果」的關係。
02. 基本語法
學會註解、命令順序、分號、shebang 與最基本的腳本結構。
註解
# 開頭的內容會被 Bash 忽略,常用於說明腳本用途。
命令順序
通常由上往下依序執行,所以順序會影響整體邏輯。
Shebang
第一行常寫 #!/bin/bash,讓系統知道用哪個解譯器執行腳本。
範例:最簡單的 Bash 腳本
#!/bin/bash
# 這是一個示範腳本
echo "第一行"
echo "第二行"
echo "第三行"
第一行
第二行
第三行
範例:同一行多個命令
echo "A"; echo "B"; echo "C"
A
B
C
最佳實務:每支腳本都建議清楚寫註解與用途說明,團隊維護會更容易。
03. 變數與輸入
學習變數宣告、字串插值、使用者輸入與環境變數。
變數宣告
使用 name="Bash" 宣告變數,等號左右不可有空格。
讀取輸入
使用 read 讓使用者從終端機輸入資料。
範例:使用變數
#!/bin/bash
name="小明"
site="Bash Academy"
echo "你好,$name"
echo "歡迎來到 $site"
你好,小明
歡迎來到 Bash Academy
範例:讀取使用者輸入
#!/bin/bash
echo "請輸入你的名字:"
read username
echo "你好,$username!"
請輸入你的名字:
王小華
你好,王小華!
範例:環境變數
echo $HOME
echo $USER
export PROJECT_ENV="production"
echo $PROJECT_ENV
/home/demo
demo
production
注意:若字串中有空白,請使用雙引號,例如
title="Hello Bash"。04. 條件判斷
使用
if、elif、else 與測試運算式處理邏輯分支。字串比較
[[ "$a" == "$b" ]]、[[ -z "$a" ]]
數值比較
-eq、-ne、-gt、-lt
檔案測試
-e 存在、-f 檔案、-d 資料夾
範例:年齡判斷
#!/bin/bash
age=20
if [ "$age" -ge 18 ]; then
echo "你已成年"
else
echo "你尚未成年"
fi
你已成年
範例:檢查檔案是否存在
#!/bin/bash
file="report.txt"
if [ -e "$file" ]; then
echo "檔案存在"
else
echo "找不到檔案"
fi
檔案存在
範例:多條件分支
score=88
if [ "$score" -ge 90 ]; then
echo "A"
elif [ "$score" -ge 80 ]; then
echo "B"
elif [ "$score" -ge 70 ]; then
echo "C"
else
echo "D"
fi
B
05. 迴圈
使用
for 與 while 進行重複執行,是自動化腳本的核心能力之一。for 迴圈
適合跑固定範圍、清單資料、檔案列表。
while 迴圈
適合根據條件持續執行,如讀檔、輪詢狀態等。
範例:for 列出數字
for i in 1 2 3 4 5
do
echo "目前數字:$i"
done
目前數字:1
目前數字:2
目前數字:3
目前數字:4
目前數字:5
範例:C-style for 迴圈
for ((i=1; i<=3; i++))
do
echo "第 $i 次執行"
done
第 1 次執行
第 2 次執行
第 3 次執行
範例:while 倒數
count=3
while [ "$count" -gt 0 ]
do
echo "倒數:$count"
count=$((count - 1))
done
echo "完成"
倒數:3
倒數:2
倒數:1
完成
06. 函式與陣列
把重複邏輯封裝成函式,並使用陣列處理一組資料,是撰寫較大型腳本的重要技巧。
函式
讓程式碼更模組化、可重用、好維護。
一般陣列
可存一組值,如主機清單、檔名列表、環境名稱。
關聯陣列
使用鍵值對,適合做設定映射與查表。
範例:函式
say_hello() {
echo "Hello, $1!"
}
say_hello "Bash"
Hello, Bash!
範例:一般陣列
fruits=("apple" "banana" "orange")
echo ${fruits[0]}
echo ${fruits[1]}
echo "總數:${#fruits[@]}"
apple
banana
總數:3
範例:關聯陣列
declare -A ports
ports[http]=80
ports[https]=443
echo "HTTP Port: ${ports[http]}"
echo "HTTPS Port: ${ports[https]}"
HTTP Port: 80
HTTPS Port: 443
07. 重導向與管線
Bash 的強項之一,就是把多個工具串接起來完成資料處理。
| 語法 | 用途 | 說明 |
|---|---|---|
> | 覆蓋輸出到檔案 | 若檔案已存在,內容會被覆蓋。 |
>> | 附加輸出到檔案 | 不會清空原檔案,會接在後面。 |
2> | 錯誤輸出 | 把 stderr 導向檔案。 |
2>&1 | 錯誤合併到標準輸出 | 常搭配 log 蒐集使用。 |
| | 管線 | 把前一個命令輸出交給下一個命令。 |
範例:輸出到檔案
echo "Today is Monday" > log.txt
echo "Append new line" >> log.txt
log.txt 內容:
Today is Monday
Append new line
範例:使用管線過濾資料
cat access.log | grep "ERROR" | sort | uniq
ERROR: database timeout
ERROR: invalid token
範例:標準錯誤導向
ls /not_exist 2> error.log
cat error.log
ls: cannot access '/not_exist': No such file or directory
08. 實戰腳本範例
這一區提供比一般入門教學更多的實戰案例,讓網站內容更完整實用。
實戰 1:備份資料夾
壓縮專案資料夾並依日期命名,適合作為每日備份腳本。
實戰 2:部署前檢查
檢查必要指令與目錄是否存在,降低部署失敗機率。
範例:每日備份腳本
#!/bin/bash
set -euo pipefail
SOURCE_DIR="./project"
BACKUP_DIR="./backup"
DATE=$(date +%Y-%m-%d)
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/project-$DATE.tar.gz" "$SOURCE_DIR"
echo "備份完成:$BACKUP_DIR/project-$DATE.tar.gz"
備份完成:./backup/project-2026-04-15.tar.gz
範例:檢查必要指令
#!/bin/bash
required_commands=("git" "docker" "node")
for cmd in "${required_commands[@]}"
do
if ! command -v "$cmd" >/dev/null 2>&1; then
echo "缺少指令:$cmd"
exit 1
fi
done
echo "所有必要指令都已安裝"
所有必要指令都已安裝
範例:監控網站存活
#!/bin/bash
URL="https://example.com"
STATUS=$(curl -o /dev/null -s -w "%{http_code}" "$URL")
if [ "$STATUS" -eq 200 ]; then
echo "網站正常"
else
echo "網站異常,HTTP 狀態碼:$STATUS"
fi
網站正常
正式腳本建議加入
set -euo pipefail,可提升穩定性與除錯效率。09. 進階主題
如果你想做得比一般入門教學網站更完整,可以加入這些進階章節。
嚴格模式
set -euo pipefail 可讓腳本在錯誤時提早中止。
參數展開
如 ${var#prefix}、${var%suffix}、${var//a/b}。
History / Completion
可介紹歷史命令展開與可程式化補全等互動技巧。
程序替換
<(command) 讓命令輸出看起來像檔案。
POSIX 相容
若要跨不同 Shell / 系統,需額外注意 POSIX 寫法。
Job Control
背景執行、前景切換、PID 管理都很重要。
範例:參數展開技巧
file="report-2026.txt"
echo ${file%.txt}
echo ${file#report-}
echo ${file//2026/FINAL}
report-2026
2026.txt
report-FINAL.txt
建議後續可再新增:字串處理、檔案測試、腳本除錯、trap 錯誤處理、case/switch、process substitution、history expansion、programmable completion。
10. 模擬終端機
這是純前端模擬輸出,方便教學展示,讓網站更像正式學習平台。
🖥️ Bash Playground(模擬)
提示:輸入 help 看可用命令
$ 歡迎使用 Bash Playground
$ 這裡是教學模擬終端機,不會真的執行系統命令。
$ 你可以試試:help、bash --version、pwd、ls、echo Hello、for-demo、clear
11. Bash 速查表
把常用寫法快速整理成可一眼掃描的教學區。
| 分類 | 寫法 | 說明 |
|---|---|---|
| 字串是否為空 | [[ -z "$name" ]] | 若字串為空則為 true |
| 字串不為空 | [[ -n "$name" ]] | 若字串有內容則為 true |
| 數值比較 | [ "$a" -gt "$b" ] | a 是否大於 b |
| 檔案存在 | [ -e file.txt ] | 檢查檔案或目錄是否存在 |
| 資料夾存在 | [ -d folder ] | 檢查是否為資料夾 |
| 函式 | my_func() { ... } | 宣告函式 |
| 陣列長度 | ${#arr[@]} | 取得陣列元素個數 |
| 算術運算 | $((a + 1)) | 整數運算 |
| 錯誤輸出合併 | 2>&1 | stderr 合併到 stdout |
| 附加輸出 | >> log.txt | 寫到檔案尾端 |
| 字串取代 | ${name//old/new} | 全部取代 old 為 new |
| 移除前綴 | ${file#prefix} | 從左側移除最短匹配前綴 |
| 移除後綴 | ${file%suffix} | 從右側移除最短匹配後綴 |
| 讀取輸入 | read -r value | 安全讀入一行文字 |
| case/switch | case "$1" in ... esac | 多分支條件判斷 |
12. Bash 小測驗
加入互動測驗,會讓你的教學網站更像正式的學習平台。
1. Bash 腳本常見的第一行是什麼?
2. 哪個符號可以把標準輸出覆蓋寫入檔案?
3. 哪個寫法可判斷檔案是否存在?
4. 哪個是正確的變數宣告?
13. 參考資源
可在網站底部放上延伸閱讀與官方文件連結,提升專業度與可信度。