跳转到内容

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
fi

1.2 条件判断注意事项

使用条件判断时需要注意以下几点。

注意事项

注意事项说明
空格条件判断的方括号前后必须有空格
分号then可以放在下一行,也可以用分号分隔
fiif语句必须以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 "字符串不为空"
fi

2.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岁"
fi

2.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 "文件不为空"
fi

3. 逻辑运算符

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 "文件存在且可读"
fi

3.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 "文件不存在或不可读"
fi

3.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 "文件不存在"
fi

4. 多分支结构

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 "不及格"
fi

4.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
fi

5. case语句

5.1 case语句概述

case语句用于多条件匹配,类似于其他语言的switch语句。

语法

bash
case 变量 in
    模式1)
        代码块1
        ;;
    模式2)
        代码块2
        ;;
    *)
        默认代码块
        ;;
esac

5.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 "无效选项"
        ;;
esac

6. 完整示例

示例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(拓展)

编写一个脚本,判断成绩等级(优秀、良好、中等、及格、不及格)。

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径