主题
Shell条件判断(if/else)
课程介绍
条件判断是编程语言的核心功能之一,Shell脚本通过if语句实现条件判断,根据不同的条件执行不同的代码块。本课程将详细讲解Shell条件判断的语法、比较运算符、逻辑运算符以及多分支结构,帮助你掌握Shell脚本中的条件控制逻辑。
1. 条件判断基础
1.1 if语句基本语法
Shell的if语句有三种基本形式:单分支、双分支、多分支。
单分支if语句:
bash
if [ 条件 ]; then
代码块
fi双分支if语句:
bash
if [ 条件 ]; then
代码块1
else
代码块2
fi多分支if语句:
bash
if [ 条件1 ]; then
代码块1
elif [ 条件2 ]; then
代码块2
elif [ 条件3 ]; then
代码块3
else
代码块4
fi1.2 条件判断注意事项
使用条件判断时需要注意以下几点。
注意事项:
| 注意事项 | 说明 |
|---|---|
| 空格 | 条件判断的方括号前后必须有空格 |
| 分号 | then可以放在下一行,也可以用分号分隔 |
| fi | if语句必须以fi结尾 |
| 嵌套 | if语句可以嵌套使用 |
2. 比较运算符
2.1 字符串比较
字符串比较用于比较两个字符串。
字符串比较运算符:
| 运算符 | 说明 | 示例 |
|---|---|---|
= | 等于 | [ "$a" = "$b" ] |
== | 等于(双等号) | [ "$a" == "$b" ] |
!= | 不等于 | [ "$a" != "$b" ] |
< | 小于 | [ "$a" \< "$b" ] |
> | 大于 | [ "$a" \> "$b" ] |
-z | 字符串为空 | [ -z "$a" ] |
-n | 字符串不为空 | [ -n "$a" ] |
示例:
bash
#!/bin/bash
# 字符串比较示例
name="张三"
# 判断字符串是否相等
if [ "$name" = "张三" ]; then
echo "姓名是张三"
fi
# 判断字符串是否不相等
if [ "$name" != "李四" ]; then
echo "姓名不是李四"
fi
# 判断字符串是否为空
if [ -z "$empty_string" ]; then
echo "字符串为空"
fi
# 判断字符串是否不为空
if [ -n "$name" ]; then
echo "字符串不为空"
fi2.2 数字比较
数字比较用于比较两个数字。
数字比较运算符:
| 运算符 | 说明 | 示例 |
|---|---|---|
-eq | 等于(equal) | [ $a -eq $b ] |
-ne | 不等于(not equal) | [ $a -ne $b ] |
-gt | 大于(greater than) | [ $a -gt $b ] |
-ge | 大于等于(greater or equal) | [ $a -ge $b ] |
-lt | 小于(less than) | [ $a -lt $b ] |
-le | 小于等于(less or equal) | [ $a -le $b ] |
示例:
bash
#!/bin/bash
# 数字比较示例
age=25
# 判断数字是否相等
if [ $age -eq 25 ]; then
echo "年龄是25岁"
fi
# 判断数字是否不相等
if [ $age -ne 30 ]; then
echo "年龄不是30岁"
fi
# 判断数字是否大于
if [ $age -gt 18 ]; then
echo "年龄大于18岁"
fi
# 判断数字是否大于等于
if [ $age -ge 18 ]; then
echo "年龄大于等于18岁"
fi
# 判断数字是否小于
if [ $age -lt 30 ]; then
echo "年龄小于30岁"
fi
# 判断数字是否小于等于
if [ $age -le 30 ]; then
echo "年龄小于等于30岁"
fi2.3 文件比较
文件比较用于判断文件的状态。
文件比较运算符:
| 运算符 | 说明 | 示例 |
|---|---|---|
-e | 文件存在 | [ -e file.txt ] |
-f | 文件存在且是普通文件 | [ -f file.txt ] |
-d | 文件存在且是目录 | [ -d /path/to/dir ] |
-r | 文件存在且可读 | [ -r file.txt ] |
-w | 文件存在且可写 | [ -w file.txt ] |
-x | 文件存在且可执行 | [ -x script.sh ] |
-s | 文件存在且不为空 | [ -s file.txt ] |
-L | 文件存在且是符号链接 | [ -L file.txt ] |
示例:
bash
#!/bin/bash
# 文件比较示例
file="config.ini"
# 判断文件是否存在
if [ -e "$file" ]; then
echo "文件存在"
else
echo "文件不存在"
fi
# 判断文件是否是普通文件
if [ -f "$file" ]; then
echo "文件是普通文件"
fi
# 判断文件是否是目录
if [ -d "$file" ]; then
echo "文件是目录"
fi
# 判断文件是否可读
if [ -r "$file" ]; then
echo "文件可读"
fi
# 判断文件是否可写
if [ -w "$file" ]; then
echo "文件可写"
fi
# 判断文件是否可执行
if [ -x "$file" ]; then
echo "文件可执行"
fi
# 判断文件是否不为空
if [ -s "$file" ]; then
echo "文件不为空"
fi3. 逻辑运算符
3.1 逻辑与
逻辑与用于同时满足多个条件。
语法:
bash
if [ 条件1 ] && [ 条件2 ]; then
代码块
fi示例:
bash
#!/bin/bash
# 逻辑与示例
age=25
name="张三"
# 判断年龄大于18且姓名是张三
if [ $age -gt 18 ] && [ "$name" = "张三" ]; then
echo "年龄大于18且姓名是张三"
fi
# 判断文件存在且可读
file="config.ini"
if [ -f "$file" ] && [ -r "$file" ]; then
echo "文件存在且可读"
fi3.2 逻辑或
逻辑或用于满足任意一个条件。
语法:
bash
if [ 条件1 ] || [ 条件2 ]; then
代码块
fi示例:
bash
#!/bin/bash
# 逻辑或示例
age=25
# 判断年龄小于18或大于60
if [ $age -lt 18 ] || [ $age -gt 60 ]; then
echo "年龄小于18或大于60"
fi
# 判断文件不存在或不可读
file="config.ini"
if [ ! -f "$file" ] || [ ! -r "$file" ]; then
echo "文件不存在或不可读"
fi3.3 逻辑非
逻辑非用于取反条件。
语法:
bash
if [ ! 条件 ]; then
代码块
fi示例:
bash
#!/bin/bash
# 逻辑非示例
age=25
# 判断年龄不等于30
if [ ! $age -eq 30 ]; then
echo "年龄不等于30"
fi
# 判断文件不存在
file="config.ini"
if [ ! -f "$file" ]; then
echo "文件不存在"
fi4. 多分支结构
4.1 if-elif-else结构
多分支结构用于处理多个条件。
语法:
bash
if [ 条件1 ]; then
代码块1
elif [ 条件2 ]; then
代码块2
elif [ 条件3 ]; then
代码块3
else
代码块4
fi示例:
bash
#!/bin/bash
# 多分支结构示例
score=85
# 判断成绩等级
if [ $score -ge 90 ]; then
echo "优秀"
elif [ $score -ge 80 ]; then
echo "良好"
elif [ $score -ge 70 ]; then
echo "中等"
elif [ $score -ge 60 ]; then
echo "及格"
else
echo "不及格"
fi4.2 嵌套if结构
嵌套if结构用于处理复杂的条件。
语法:
bash
if [ 条件1 ]; then
if [ 条件2 ]; then
代码块1
else
代码块2
fi
else
代码块3
fi示例:
bash
#!/bin/bash
# 嵌套if结构示例
age=25
gender="male"
# 判断年龄和性别
if [ $age -ge 18 ]; then
if [ "$gender" = "male" ]; then
echo "成年男性"
else
echo "成年女性"
fi
else
if [ "$gender" = "male" ]; then
echo "未成年男性"
else
echo "未成年女性"
fi
fi5. case语句
5.1 case语句概述
case语句用于多条件匹配,类似于其他语言的switch语句。
语法:
bash
case 变量 in
模式1)
代码块1
;;
模式2)
代码块2
;;
*)
默认代码块
;;
esac5.2 case语句示例
case语句的使用示例。
示例1:判断星期几
bash
#!/bin/bash
# 判断星期几
day=$(date +%A)
case $day in
Monday)
echo "今天是星期一"
;;
Tuesday)
echo "今天是星期二"
;;
Wednesday)
echo "今天是星期三"
;;
Thursday)
echo "今天是星期四"
;;
Friday)
echo "今天是星期五"
;;
Saturday|Sunday)
echo "今天是周末"
;;
*)
echo "未知日期"
;;
esac示例2:判断用户输入
bash
#!/bin/bash
# 判断用户输入
echo "请输入选项(start/stop/restart):"
read option
case $option in
start)
echo "启动服务"
;;
stop)
echo "停止服务"
;;
restart)
echo "重启服务"
;;
*)
echo "无效选项"
;;
esac6. 完整示例
示例1:用户登录验证
bash
#!/bin/bash
# 用户登录验证
# 配置
USERNAME="admin"
PASSWORD="password"
# 获取用户输入
echo "请输入用户名:"
read username
echo "请输入密码:"
read password
# 验证用户名和密码
if [ "$username" = "$USERNAME" ] && [ "$password" = "$PASSWORD" ]; then
echo "登录成功"
else
echo "用户名或密码错误"
exit 1
fi示例2:文件检查
bash
#!/bin/bash
# 文件检查
# 配置
FILE="config.ini"
# 检查文件
if [ ! -e "$FILE" ]; then
echo "文件不存在,创建文件"
touch "$FILE"
fi
# 检查文件权限
if [ -r "$FILE" ] && [ -w "$FILE" ]; then
echo "文件可读可写"
else
echo "文件不可读或不可写"
exit 1
fi
# 检查文件大小
if [ -s "$FILE" ]; then
SIZE=$(du -h "$FILE" | cut -f1)
echo "文件大小:$SIZE"
else
echo "文件为空"
fi示例3:系统状态检查
bash
#!/bin/bash
# 系统状态检查
# 检查CPU使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
if [ $(echo "$CPU_USAGE > 80" | bc -l) ]; then
echo "警告:CPU使用率过高($CPU_USAGE%)"
else
echo "CPU使用率正常($CPU_USAGE%)"
fi
# 检查内存使用率
MEMORY_USAGE=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}')
if [ $(echo "$MEMORY_USAGE > 80" | bc -l) ]; then
echo "警告:内存使用率过高($MEMORY_USAGE%)"
else
echo "内存使用率正常($MEMORY_USAGE%)"
fi
# 检查磁盘使用率
DISK_USAGE=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 80 ]; then
echo "警告:磁盘使用率过高($DISK_USAGE%)"
else
echo "磁盘使用率正常($DISK_USAGE%)"
fi课程总结
这节课我们学习了Shell条件判断(if/else)。
核心内容:
- 条件判断基础
- 比较运算符(字符串比较、数字比较、文件比较)
- 逻辑运算符(逻辑与、逻辑或、逻辑非)
- 多分支结构(if-elif-else、嵌套if)
- case语句
- 完整示例
重要概念:
- 单分支if语句:只包含if和fi
- 双分支if语句:包含if、else和fi
- 多分支if语句:包含if、elif、else和fi
- 逻辑与:同时满足多个条件
- 逻辑或:满足任意一个条件
- 逻辑非:取反条件
- case语句:多条件匹配
条件判断是Shell脚本编程的核心功能,掌握这些知识后,我们将在后续课程中学习循环结构、函数定义等内容。
课后练习
练习1(基础)
编写一个脚本,判断一个数字是否大于10。
练习2(进阶)
编写一个脚本,判断一个文件是否存在且可读。
练习3(拓展)
编写一个脚本,判断成绩等级(优秀、良好、中等、及格、不及格)。