Linux Bash Shell 基礎

Bash Shell 介紹

Shell 是「介於使用者與作業系統之間的介面」,可讓使用者藉由指令來操作系統。無論是 Windows 或 Linux 系統都會提供 Shell。常見的 Shell 包括:

  • Bourne shell(sh)
  • C shell(csh)
  • Korn shell(ksh)
  • Z shell(zsh)
  • Bourne Again Shell(bash)

其中,bash 是目前最普遍使用、功能最完善的 Shell。

相關資訊:

  • 系統已安裝的 Shell 通常記錄在 /etc/shells
  • 使用者登入 Linux 預設會取得 bash Shell
  • bash 執行檔路徑通常為 /bin/bash

bash 會記錄使用者輸入的命令,先暫存於記憶體中,使用者登出時會將命令附加寫入 ~/.bash_history。此檔案會保留多次登入的歷史命令,但記錄數量依系統設定(可能為 300、500、1000 等)有所限制。


指令搜尋順序

當輸入指令時,bash 查找順序如下:

  1. 是否為 bash 內建指令(使用 help 可查詢)
  2. 是否為別名(alias)
  3. 是否存在於 $PATH 環境變數指定的目錄中
# 查看目前 PATH 設定
echo $PATH

# 暫時新增 /opt 到 PATH(本次 session 有效)
export PATH=$PATH:/opt

# 若要永久生效,需加入 /etc/profile 或 ~/.bashrc 中
# 例如:
echo 'export PATH=$PATH:/opt' >> ~/.bashrc
source ~/.bashrc

查看歷史命令

# 顯示最近 10 筆歷史命令
history 10

# 或直接檢視 ~/.bash_history 檔案
cat ~/.bash_history

Bash Alias 命令別名

命令別名可簡化輸入長指令。設定方式如下:

# 設定臨時別名(僅本次登入有效)
alias cdt="cd t1/t2/t3/t4"

# 設定永久別名(加入 ~/.bashrc)
echo 'alias cdt="cd t1/t2/t3/t4"' >> ~/.bashrc
source ~/.bashrc

解除別名:

unalias cdt

查看所有目前定義的別名:

alias

基本輸入與輸出

輸入

# 基本輸入
read name

# 顯示提示文字
read -p "Who are you? " name

# 設定輸入等待時間為 5 秒
read -t 5 name

輸出

# 顯示變數內容
echo "I'm $name"

變數設定

宣告與使用

  • 變數區分大小寫
  • 不可用數字開頭命名
  • 宣告:變數=值(等號兩邊不能有空格)
  • 取值:使用 $變數echo $變數

指令取值

# 指令結果儲存於變數中
now=$(date)
echo $now

取消變數

unset 變數名稱

字串處理

宣告方式

# 無引號(裸字串):不可包含空白或特殊字元
name=jack

# 單引號:內文不會展開變數
name='jack $HOME'

# 雙引號:內文可展開變數
home="我的家是 $HOME"

字串連接

first="Hello"
second="World"
message=$first" "$second
echo $message  # 顯示 Hello World

取得子字串

text="abcdef"
echo ${text:1:3}  # 顯示 bcd

取得字串長度

echo ${#text}  # 顯示 6

取代子字串

text="hello world world"
echo ${text/world/earth}     # 只取代第一個
echo ${text//world/earth}    # 取代全部

整數運算

bash 不支援浮點數,僅支援整數。

a=5
b=3

# 錯誤方式(僅會輸出字串)
echo $a+$b  # 輸出:5+3

# 正確方式(用 $(( )))
echo $(($a + $b))    # 輸出:8
echo $(($a * $b))    # 輸出:15
echo $(($a % $b))    # 輸出:2

布林變數

Bash 無內建布林型別,通常以字串模擬:

isTrue=true
isFalse=false

判斷時需額外條件式處理,例如搭配 if 語法使用 [ "$isTrue" = true ]


陣列處理

宣告與取值

arr=("a" "b" "c")

# 取得第一個元素(索引從 0 開始)
echo ${arr[0]}  # a

# 顯示所有元素
echo ${arr[@]}

# 顯示元素個數
echo ${#arr[@]}