# Shell布爾運算符與邏輯運算符有哪些
## 一、概述
在Shell腳本編程中,布爾運算符和邏輯運算符是實現條件判斷、流程控制的核心工具。它們允許我們對多個條件進行組合判斷,構建復雜的程序邏輯。本文將系統介紹Shell中的布爾運算符與邏輯運算符的分類、語法及使用場景。
## 二、布爾運算符
布爾運算符主要用于測試條件的真假狀態,返回`true`(0)或`false`(非0)。
### 1. 基本布爾運算符
| 運算符 | 說明 | 示例 |
|--------|-----------------------|--------------------------|
| `!` | 邏輯非(取反) | `[ ! -f "file.txt" ]` |
| `-a` | 邏輯與(AND) | `[ $a -eq 1 -a $b -eq 2 ]` |
| `-o` | 邏輯或(OR) | `[ $a -eq 1 -o $b -eq 2 ]` |
> **注意**:`-a`和`-o`在`[ ]`測試語法中使用,新版腳本推薦使用`&&`和`||`替代。
### 2. 文件測試運算符
這些運算符常用于文件狀態檢查:
```bash
[ -e file ] # 文件/目錄是否存在
[ -f file ] # 是否為普通文件
[ -d dir ] # 是否為目錄
[ -r file ] # 文件可讀
[ -w file ] # 文件可寫
[ -x file ] # 文件可執行
[ -s file ] # 文件大小非空
[ $a -eq $b ] # 等于(equal)
[ $a -ne $b ] # 不等于(not equal)
[ $a -gt $b ] # 大于(greater than)
[ $a -lt $b ] # 小于(less than)
[ $a -ge $b ] # 大于等于(greater or equal)
[ $a -le $b ] # 小于等于(less or equal)
[ "$str1" = "$str2" ] # 字符串相等
[ "$str1" != "$str2" ] # 字符串不等
[ -z "$str" ] # 字符串為空
[ -n "$str" ] # 字符串非空
邏輯運算符用于連接多個命令或條件,比布爾運算符更靈活。
運算符 | 說明 | 示例 |
---|---|---|
&& |
邏輯與(AND) | cmd1 && cmd2 (cmd1成功才執行cmd2) |
|| |
邏輯或(OR) | cmd1 || cmd2 (cmd1失敗才執行cmd2) |
! |
邏輯非(NOT) | ! cmd |
# 檢查文件存在且可讀
[ -f "data.txt" ] && [ -r "data.txt" ] && echo "File is readable"
# 目錄不存在則創建
[ -d "/backup" ] || mkdir -p /backup
# 非root用戶退出
[ "$(id -u)" -eq 0 ] || { echo "Must be root"; exit 1; }
# 命令分組(影響邏輯運算范圍)
{ cmd1; cmd2; } # 當前Shell執行
(cmd1; cmd2) # 子Shell執行
Shell提供多種條件測試語法,運算符使用方式不同:
test
命令與[ ]
test "$a" -eq 1 # 傳統寫法
[ "$a" -eq 1 ] # 等效寫法(注意空格]
[[ ]]
增強測試Bash擴展的測試語法,支持更多特性:
[[ $str == pattern ]] # 模式匹配
[[ $str =~ regex ]] # 正則匹配
[[ -e $file && -r $file ]] # 可直接使用&&/||
(( ))
算術運算(( a == 1 )) # 算術比較
(( a++ )) # 算術運算
if [ -f "$file" ] && [ -s "$file" ]; then
echo "Valid file detected"
elif [ -d "$dir" ] || mkdir "$dir"; then
echo "Directory ready"
else
echo "Error" >&2
fi
while [ $counter -lt 10 ] && [ ! -f "stop.flag" ]; do
echo "Iteration $counter"
((counter++))
done
command1 || {
echo "Command1 failed with status $?" >&2
exit 1
}
空格要求:[ ]
內每個元素都需要空格分隔
[ "$a" = 1 ] # 正確
[ "$a"=1 ] # 語法錯誤
變量引用:始終用引號包裹變量防止空值錯誤
[ -n "$var" ] # 安全寫法
運算符優先級:!
> &&
> ||
兼容性:[[ ]]
和(( ))
是Bash擴展,POSIX Shell不可用
類型 | 運算符 | 適用場景 | |
---|---|---|---|
布爾運算符 | -a , -o , ! |
基本條件測試 | |
邏輯運算符 | && , ` |
, !` |
|
文件測試 | -e , -f , -d |
文件系統操作 | |
數值比較 | -eq , -lt 等 |
算術判斷 | |
字符串比較 | = , != , -z |
文本處理 |
掌握這些運算符的組合使用,可以大幅提升Shell腳本的健壯性和靈活性。建議在實際腳本中多結合set -euo pipefail
等嚴格模式使用,避免常見陷阱。
“`
注:本文實際約1200字,可通過以下方式擴展:
1. 增加更多實用示例
2. 添加性能對比測試
3. 補充各Shell解釋器的差異說明(如Bash/Zsh/Dash)
4. 加入調試技巧(如set -x
跟蹤邏輯運算)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。