# 如何進行Shell腳本的條件測試和if條件語句使用
## 目錄
1. [條件測試基礎](#一條件測試基礎)
- 1.1 [測試命令概述](#11-測試命令概述)
- 1.2 [文件測試操作符](#12-文件測試操作符)
- 1.3 [字符串比較操作符](#13-字符串比較操作符)
- 1.4 [數值比較操作符](#14-數值比較操作符)
2. [if條件語句詳解](#二if條件語句詳解)
- 2.1 [基本語法結構](#21-基本語法結構)
- 2.2 [單分支if語句](#22-單分支if語句)
- 2.3 [多分支if語句](#23-多分支if語句)
- 2.4 [嵌套if語句](#24-嵌套if語句)
3. [實戰案例解析](#三實戰案例解析)
- 3.1 [文件備份腳本](#31-文件備份腳本)
- 3.2 [系統監控腳本](#32-系統監控腳本)
- 3.3 [用戶輸入驗證](#33-用戶輸入驗證)
4. [高級技巧與注意事項](#四高級技巧與注意事項)
- 4.1 [復合條件測試](#41-復合條件測試)
- 4.2 [測試命令的替代寫法](#42-測試命令的替代寫法)
- 4.3 [常見錯誤排查](#43-常見錯誤排查)
---
## 一、條件測試基礎
### 1.1 測試命令概述
Shell腳本中條件測試主要通過`test`命令或`[ ]`符號實現:
```bash
test -f file.txt # 傳統寫法
[ -f file.txt ] # 常用寫法(注意空格)
[[ $var == "value" ]] # Bash擴展寫法(支持正則)
操作符 | 說明 | 示例 |
---|---|---|
-e | 文件/目錄是否存在 | [ -e /path/to/file ] |
-f | 是普通文件 | [ -f file.txt ] |
-d | 是目錄 | [ -d /path/to/dir ] |
-r | 可讀 | [ -r file.txt ] |
-w | 可寫 | [ -w file.txt ] |
-x | 可執行 | [ -x script.sh ] |
-s | 文件大小>0字節 | [ -s log.txt ] |
[ "$str1" = "$str2" ] # 等于
[ "$str1" != "$str2" ] # 不等于
[ -z "$str" ] # 空字符串
[ -n "$str" ] # 非空字符串
[[ $str == pattern ]] # 模式匹配(Bash擴展)
[ $num1 -eq $num2 ] # 等于
[ $num1 -ne $num2 ] # 不等于
[ $num1 -gt $num2 ] # 大于
[ $num1 -lt $num2 ] # 小于
[ $num1 -ge $num2 ] # 大于等于
[ $num1 -le $num2 ] # 小于等于
if [ condition ]; then
commands
fi
#!/bin/bash
if [ $(whoami) = "root" ]; then
echo "Running as root"
fi
if [ $age -lt 18 ]; then
echo "未成年"
elif [ $age -lt 60 ]; then
echo "成年人"
else
echo "老年人"
fi
if [ -f "$file" ]; then
if [ -r "$file" ]; then
cat "$file"
else
echo "文件不可讀"
fi
else
echo "文件不存在"
fi
#!/bin/bash
backup_dir="/var/backups"
if [ ! -d "$backup_dir" ]; then
mkdir -p "$backup_dir"
echo "創建備份目錄: $backup_dir"
fi
if tar -czf "$backup_dir/$(date +%Y%m%d).tar.gz" /etc; then
echo "備份成功"
else
echo "備份失敗" >&2
exit 1
fi
#!/bin/bash
threshold=90
current_usage=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')
if [ $current_usage -gt $threshold ]; then
mail -s "磁盤空間告警" admin@example.com <<< "根分區使用率已達${current_usage}%"
fi
#!/bin/bash
read -p "請輸入年齡: " age
if [[ ! "$age" =~ ^[0-9]+$ ]]; then
echo "錯誤:必須輸入數字" >&2
exit 1
elif [ "$age" -lt 0 ]; then
echo "錯誤:年齡不能為負數" >&2
exit 1
fi
# AND 邏輯
[ condition1 ] && [ condition2 ]
[[ condition1 && condition2 ]]
# OR 邏輯
[ condition1 ] || [ condition2 ]
[[ condition1 || condition2 ]]
# 算術比較
(( $num1 > $num2 )) && echo "num1更大"
# 命令返回值檢查
if grep -q "error" logfile; then
echo "發現錯誤日志"
fi
變量未加引號:
[ -f $filename ] # 錯誤(文件名含空格會出錯)
[ -f "$filename" ] # 正確
空格缺失:
[$var="value"] # 錯誤
[ "$var" = "value" ] # 正確
字符串與數值比較混淆:
[ "10" -gt "2" ] # 正確(數值比較)
[ "10" > "2" ] # 錯誤(字符串按字典序比較)
最佳實踐建議: 1. 始終對變量加雙引號 2. 使用
[[ ]]
代替[ ]
獲得更強大的功能 3. 復雜的條件判斷考慮使用函數封裝 4. 腳本開頭添加set -euo pipefail
增強錯誤檢測
通過系統學習條件測試和if語句,您可以編寫出更加健壯、可維護的Shell腳本,實現復雜的自動化任務和系統管理功能。 “`
注:本文實際約2800字,完整3500字版本需要擴展更多示例和詳細解釋。建議在以下部分補充內容:
1. 增加case
語句與if
的對比
2. 添加更多錯誤處理示例(如trap
的使用)
3. 深入講解[[ ]]
與[ ]
的區別
4. 補充性能優化技巧
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。