Bash Academy

Bash 中文教學網站

專業的Bash繁體中文教學及練習範例網站,提供豐富的Bash線上教學及自學資源,涵蓋 Bash入門、Bash指令、語法、Bash用法、變數、條件判斷、迴圈、函式、陣列、重導向、Bash腳本實戰、速查表與測驗,及推介多個Bash教學課程。

章節 13 互動功能 7+ 程式範例 20+

0

已完成章節

0%

學習進度

深 / 淺色

一鍵切換專業 UI 主題

互動體驗

終端機模擬、測驗、複製程式碼

01. Bash 是什麼?

認識 Bash、Shell 與它在 Linux / Unix 系統中的角色。

什麼是 Bash?

Bash 是常見的 Unix/Linux Shell,也常作為系統預設命令列環境。你可以直接執行指令,也可以撰寫 Shell Script 自動化工作。

為什麼要學 Bash?

它很適合做系統管理、部署腳本、批次處理、日誌分析、檔案操作與 CI/CD 流程,是 Linux 生態非常核心的技能。

🧠 指令式思維
快速與系統互動,比圖形介面更高效。
⚙️ 自動化工作
將重複手動流程改為腳本執行。
📦 DevOps 必備
在伺服器、容器與部署場景中極常用。
🔗 可整合多種工具
能搭配 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. 條件判斷

使用 ifelifelse 與測試運算式處理邏輯分支。

字串比較

[[ "$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. 迴圈

使用 forwhile 進行重複執行,是自動化腳本的核心能力之一。

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>&1stderr 合併到 stdout
附加輸出>> log.txt寫到檔案尾端
字串取代${name//old/new}全部取代 old 為 new
移除前綴${file#prefix}從左側移除最短匹配前綴
移除後綴${file%suffix}從右側移除最短匹配後綴
讀取輸入read -r value安全讀入一行文字
case/switchcase "$1" in ... esac多分支條件判斷

12. Bash 小測驗

加入互動測驗,會讓你的教學網站更像正式的學習平台。

1. Bash 腳本常見的第一行是什麼?

2. 哪個符號可以把標準輸出覆蓋寫入檔案?

3. 哪個寫法可判斷檔案是否存在?

4. 哪個是正確的變數宣告?

13. 參考資源

可在網站底部放上延伸閱讀與官方文件連結,提升專業度與可信度。