Shell 腳本中的 if 語句是流程控制核心。本文系統整理字串比較、數值比較、檔案測試、複合邏輯四大判斷類型語法,並提供豐富實戰範例與常見錯誤避坑指南。
| 運算子 | 為真條件 |
|---|---|
str1 = str2 | 內容、長度完全相同 |
str1 != str2 | 不相等 |
-n str1 | 長度 > 0 (非空) |
-z str1 | 長度 = 0 (空字串) |
str1 | 非空 (等同 -n) |
| 運算子 | 為真條件 |
|---|---|
int1 -eq int2 | 相等 |
int1 -ne int2 | 不等 |
int1 -gt int2 | 大於 |
int1 -ge int2 | 大於等於 |
int1 -lt int2 | 小於 |
int1 -le int2 | 小於等於 |
| 運算子 | 為真條件 |
|---|---|
-r file | 可讀 |
-w file | 可寫 |
-x file | 可執行 |
-f file | 一般檔案 |
-d file | 目錄 |
-c file | 字元特殊裝置 |
-b file | 區塊特殊裝置 |
-s file | 檔案大小非 0 |
-t fd | 檔案描述符指向終端機 (預設 fd=1) |
| 運算子 | 意義 |
|---|---|
-a | 邏輯 AND (且) |
-o | 邏輯 OR (或) |
! | 邏輯 NOT (非) |
#!/bin/sh
myPath="/var/log/httpd/"
myFile="/var/log/httpd/access.log"
# 檢查目錄是否存在且可執行 (可進入)
if [ ! -x "$myPath" ]; then
mkdir -p "$myPath"
fi
# 檢查目錄是否存在 (較通用)
if [ ! -d "$myPath" ]; then
mkdir -p "$myPath"
fi
# 檢查檔案是否存在
if [ ! -f "$myFile" ]; then
touch "$myFile"
fi
# 檢查變數是否有值
if [ ! -n "$myVar" ]; then
echo "$myVar is empty"
exit 0
fi
if [ "$var1" == "$var2" ]; then
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi
#!/bin/sh
SYSTEM=$(uname -s)
if [ "$SYSTEM" = "Linux" ]; then
echo "Linux"
elif [ "$SYSTEM" = "FreeBSD" ]; then
echo "FreeBSD"
elif [ "$SYSTEM" = "Solaris" ]; then
echo "Solaris"
else
echo "Unknown: $SYSTEM"
fi
1.
if與[之間 必須有空格
2.[與判斷條件之間 必須有空格
3. 判斷條件與]之間 必須有空格
4.]與;(或then) 之間 不能有空格
錯誤寫法:if [$a=1];then
正確寫法:if [ $a = 1 ]; then
(( ... )):算術評估,支援 > < == && || 等 C 風格運算子[[ ... ]]:增強測試,支援模式比對 == =~ (正則)、字串比較無需加引號、邏輯運算子 && ||建議:新腳本優先使用 [[ ... ]] 與 (( ... )),相容性更好、錯誤更少。