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

📚 推荐练习题(可选)

  1. 编写一个脚本,判断用户输入的数字是奇数还是偶数?
  2. 写一个脚本,判断某个服务是否运行(例如 nginx),如果没有就启动它。
  3. 实现一个简易计算器,接收两个参数和一个运算符(+、-、*、/),输出结果。
  4. 编写一个脚本,检查 /tmp 目录下是否有超过 10MB 的文件,如果有则删除。

🎯 下一章预告:《流程控制语句 —— if、case、for、while》

如果你完成了本章内容并理解了所有示例,那么你已经可以开始尝试写一些简单的自动化脚本啦!

需要我继续为你生成下一章内容吗?😊

posted @ 2023-04-02 21:26  红尘过客2022  阅读(32)  评论(0)    收藏  举报