Shell 基本运算符
Shell 基本运算符
🎉 欢迎来到《Shell 基本运算符》学习章节!在这一章中,你将掌握 Linux Shell 中常用的基本运算符及其使用方式。这些运算符是编写 Shell 脚本时非常基础且强大的工具,能够帮助你进行条件判断、数学计算、字符串比较等操作。
🎯 学习目标
- 理解 Shell 中常见的运算符类型:算术运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符
- 掌握如何在
bash脚本中使用这些运算符 - 学会结合实际场景(如自动化脚本、日志分析、权限检查)灵活运用运算符
- 了解不同运算符的优先级和常见错误处理方式
⭐ 核心重点
| 类型 | 运算符 | 描述 |
|---|---|---|
| 算术运算符 | +, -, *, /, %, **, ++, -- |
支持基本数学计算 |
| 关系运算符 | -eq, -ne, -gt, -lt, -ge, -le |
用于整数比较 |
| 布尔运算符 | !, -o, -a |
逻辑非、或、与 |
| 字符串运算符 | =, !=, -z, -n, str |
字符串比较与判断 |
| 文件测试运算符 | -f, -d, -r, -w, -x, -e |
判断文件属性 |
📖 详细讲解
1️⃣ 算术运算符 Arithmetic Operators
✅ 支持的运算符:
+加法-减法*乘法/除法%取模**幂运算++自增--自减
🔧 使用方式:
a=10
b=3
echo $(( a + b )) # 输出 13
echo $(( a - b )) # 输出 7
echo $(( a * b )) # 输出 30
echo $(( a / b )) # 输出 3(整除)
echo $(( a % b )) # 输出 1
echo $(( a ** b )) # 输出 1000(10^3)
# 自增自减
let c=5
let c++
echo $c # 输出 6
let c--
echo $c # 输出 5
⚠️ 注意事项:
- Bash 默认只支持整数运算。
- 浮点数需借助
bc或其他外部命令。 - 使用
$(( ... ))是最推荐的方式。
💡 应用场景举例:
# 计算磁盘使用率
used=$(df -h / | awk 'NR==2 {print $3}' | sed 's/G//')
total=$(df -h / | awk 'NR==2 {print $2}' | sed 's/G//')
# 使用 bc 来做浮点数计算
percent=$(echo "scale=2; ($used / $total) * 100" | bc)
echo "当前根目录使用率为: ${percent}%"
df -h / → 显示磁盘使用情况
|
↓
awk 'NR==2 {print $3}' → 提取已使用空间(第三列)
|
↓
sed 's/G//' → 去除单位 G
|
↓
赋值给变量 used → 得到一个数字(例如:15)
2️⃣ 关系运算符 Relational Operators
主要用于比较两个数值之间的关系,返回布尔值(true/false)。
| 运算符 | 含义 |
|---|---|
-eq |
等于 |
-ne |
不等于 |
-gt |
大于 |
-lt |
小于 |
-ge |
大于等于 |
-le |
小于等于 |
📌 示例:
a=10
b=20
if [ $a -eq $b ]; then
echo "a 等于 b"
elif [ $a -gt $b ]; then
echo "a 大于 b"
else
echo "a 小于 b"
fi
输出:
a 小于 b
⚠️ 注意事项:
- 必须使用
[ ]或[[ ]]进行比较 - 仅适用于整数,不适用于浮点数
3️⃣ 布尔运算符 Boolean Operators
| 运算符 | 含义 |
|---|---|
! |
非(取反) |
-o |
或(OR) |
-a |
与(AND) |
📌 示例:
a=10
b=20
if [ $a -lt 20 -a $b -gt 15 ]; then
echo "a < 20 且 b > 15 成立"
fi
输出:
a < 20 且 b > 15 成立
⚠️ 注意事项:
-a和-o在现代脚本中更推荐使用&&和||替代- 推荐使用双括号
[[ ... ]]提升可读性和安全性
4️⃣ 字符串运算符 String Operators
| 运算符 | 含义 |
|---|---|
= |
是否相等 |
!= |
是否不等 |
-z |
是否为空 |
-n |
是否非空 |
str |
字符串是否存在 |
📌 示例:
str1="hello"
str2="world"
if [ "$str1" = "$str2" ]; then
echo "两个字符串相等"
else
echo "两个字符串不相等"
fi
if [ -z "$str1" ]; then
echo "字符串为空"
else
echo "字符串非空"
fi
输出:
两个字符串不相等
字符串非空
⚠️ 注意事项:
- 字符串必须加引号,否则可能出错
=左右两边要有空格
5️⃣ 文件测试运算符 File Test Operators
| 运算符 | 含义 |
|---|---|
-f file |
是否为普通文件 |
-d dir |
是否为目录 |
-r file |
是否可读 |
-w file |
是否可写 |
-x file |
是否可执行 |
-e file |
是否存在 |
📌 示例:
file="/etc/passwd"
if [ -f "$file" ]; then
echo "$file 是一个普通文件"
fi
if [ -r "$file" ]; then
echo "$file 可读"
fi
if [ -w "$file" ]; then
echo "$file 可写"
else
echo "$file 不可写"
fi
输出(取决于你的系统):
/etc/passwd 是一个普通文件
/etc/passwd 可读
/etc/passwd 不可写
⚠️ 注意事项:
- 执行前请确保路径正确
- 需要对应权限才能检测某些属性(如
-w)
🧪 综合案例:自动备份脚本 + 条件判断
#!/bin/bash
backup_dir="/home/ubuntu/backups"
log_file="/var/log/backup.log"
date=$(date +%Y%m%d)
# 创建备份目录(如果不存在)
if [ ! -d "$backup_dir" ]; then
mkdir -p "$backup_dir"
echo "[$(date)] 备份目录已创建" >> "$log_file"
fi
# 判断源文件是否存在
src_file="/etc/passwd"
if [ -f "$src_file" ]; then
cp "$src_file" "$backup_dir/passwd_$date.bak"
echo "[$(date)] $src_file 已备份" >> "$log_file"
else
echo "[$(date)] 错误:$src_file 不存在" >> "$log_file"
fi
# 判断是否备份成功
if [ $? -eq 0 ]; then
echo "✅ 备份成功完成"
else
echo "❌ 备份失败,请检查日志"
fi
运行后你会在 /home/ubuntu/backups/ 下看到类似 passwd_20250618.bak 的备份文件,并在 /var/log/backup.log 中记录日志。
🧠 总结 & 小贴士
- Shell 运算符是构建复杂逻辑的基础
- 推荐使用
[[ ]]而不是[ ],更安全且支持更多功能 - 使用
man test查看完整测试表达式说明 - 多使用
echo $?检查上一条命令是否成功执行 - 编写脚本时务必加上
#!/bin/bash并赋予执行权限chmod +x script.sh
📚 推荐练习题(可选)
- 编写一个脚本,判断用户输入的数字是奇数还是偶数?
- 写一个脚本,判断某个服务是否运行(例如 nginx),如果没有就启动它。
- 实现一个简易计算器,接收两个参数和一个运算符(+、-、*、/),输出结果。
- 编写一个脚本,检查
/tmp目录下是否有超过 10MB 的文件,如果有则删除。
🎯 下一章预告:《流程控制语句 —— if、case、for、while》
如果你完成了本章内容并理解了所有示例,那么你已经可以开始尝试写一些简单的自动化脚本啦!
需要我继续为你生成下一章内容吗?😊

浙公网安备 33010602011771号