2、Shell 条件语句

Shell 条件语句

1. 条件测试操作

判断原理: 依靠命令返回状态值 $?

  • 返回 0:成功,条件成立
  • 返回非 0:失败,条件不成立

条件测试 3 种写法:

  • test 条件表达式
  • [ 条件表达式 ] 最常用
  • [[ 条件表达式 ]] 升级版,支持通配符、正则

**注意:**中括号内侧必须留空格

  • ✅ [ -f /etc/passwd ]
  • ❌ [-f /etc/passwd] 语法报错

2. 文件测试:检测文件/目录属性

文件测试操作符:

  • -d:是否为目录
  • -f:是否为普通文件
  • -e:文件或目录是否存在
  • -r:是否具备读权限
  • -w:是否具备写权限
  • -x:是否具备可执行权限
  • -b:块设备(硬盘、U 盘)
  • -L:软链接文件(快捷方式)
  • -s:文件存在且不为空

逻辑符号:

  • ! 取反(代表"不")
  • &&:前面成立才执行后面命令

示例: 目录不存在就创建 [ ! -e /opt/kgc ] && mkdir /opt/kgc

3. 整数值比较:整数比大小

注意: 只用于整数,不能直接使用 > <

整数比较操作符:

  • -eq 等于(equal)
  • -ne 不等于(not equal)
  • -gt 大于(greater than)
  • -lt 小于(less than)
  • -ge 大于等于
  • -le 小于等于

**命令替换 $(命令):**获取命令输出结果赋值给变量

  • 示例:FreeCC=$(free -m | grep "Mem: " | awk '{print $7}')

4. 字符串比较:文字比对、判空

字符串操作符:

  • = 两个字符串相等
  • != 两个字符串不相等
  • -z 字符串为空(zero)
  • -n 字符串不为空

最佳实践: 变量加双引号 "$变量",防止空格引发报错

read -p "提示文字" 变量:接收用户键盘输入

5. 逻辑测试:组合多个条件

  • && 逻辑与(并且):全部满足才为真,一假则假
  • || 逻辑或(或者):满足任意一个即为真,一真则真
  • ! 逻辑非(取反),颠倒真假
  • 旧写法:[] 内部可用 -a 代替 &&;-o 代替 ||

示例:

  • [ -d /etc ] && [ -r /etc ] 目录存在并且可读
  • [ -d /etc ] || [ -f /etc ] 是目录或者是文件

6. 单分支 if 语句

**逻辑:**条件成立执行代码;不成立直接跳过

语法 1(换行写法):

bash 复制代码
if 条件测试
then
    命令序列
fi

语法 2(同行分号写法):

bash 复制代码
if [ ! -d /media/cdrom ]; then
    mkdir -p /media/cdrom
fi

关键字说明:

  • fi:if 倒写,代表 if 判断结束,必须配对
  • mkdir -p:递归创建多级目录,自动创建父目录
  • 2>/dev/null:丢弃错误输出

**案例:**挂载点不存在自动创建目录

7. 双分支 if 语句

**逻辑:**条件成立执行 A;不成立执行 B,两种分支都处理

语法:

bash 复制代码
if 条件测试
then
    命令序列1  # 条件成立
else
    命令序列2  # 条件不成立
fi

高频实战案例:

**案例 1:**ping 检测主机存活

  • ping 参数:-c 次数,-i 间隔,-W 超时
  • &>/dev/null:丢弃标准输出 + 错误输出
  • 使用 $? 获取 ping 命令返回状态

**案例 2:**判断是否 root 用户

  • 系统内置变量 $UID
  • root 用户 UID=0;普通用户 UID≥1000

**案例 3:**判断用户是否存在

  • id 用户名 &>/dev/null
  • $? -eq 0 用户存在
  • useradd 创建用户

核心要点:

  • if 和 fi 必须成对出现
  • then 对应成立分支,else 对应不成立分支
  • $? 获取上一条命令执行返回码

8. 多分支 if 语句(多个选择)

8.1 概念
  • 用于多个互斥条件判断,从上往下依次匹配
  • 匹配成功执行对应代码,不再执行后续分支
  • 适用场景:成绩分级、多区间判断
8.2 语法格式
bash 复制代码
if 条件测试1
then
    命令序列1
elif 条件测试2
then
    命令序列2
elif 条件测试3
then
    命令序列3
else
    全部条件不满足执行
fi
  • elif 为完整关键字;else 可选,用于兜底
  • 结尾必须写 fi 结束 if
8.3 组合条件两种写法

并且(同时满足):

  • [ 条件1 ] && [ 条件2 ]
  • [ 条件1 -a 条件2 ]

或者(满足其一):

  • [ 条件1 ] || [ 条件2 ]
  • [ 条件1 -o 条件2 ]
8.4 注意要点
  • 范围判断:严格条件写前面
  • else 捕获非法输入、越界数值
  • 一个 if 必须对应一个 fi
8.5 典型场景
  • 成绩等级划分
  • 判断文件类型:普通文件/目录/块设备
  • 服务器多状态判断
相关推荐
Pniubi1 小时前
分片的意义?
java·开发语言
酷虎软件1 小时前
视频加字幕怎么制作
java·前端·音视频
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 阿里云概述与项目中的云服务选型
java·阿里云·交友
梦帮科技2 小时前
Linux 内存取证学与 Rootkit 猎杀——Volatility 核心剖析与内核隐藏模块逆向清除
linux·运维·服务器·神经网络·算法·网络安全
无足鸟ICT2 小时前
【RHCA+】软件包
linux·运维·服务器
2601_962071002 小时前
Kimi K3 vs DeepSeek V4-Pro实测对比:2026年同一入口十道题,耗时与token消耗差在哪
android·java·数据库
海盗12342 小时前
微软技术日报 2026-10-15:Defender 下到 Linux 桌面,Copilot 订阅明天改名
linux·人工智能·microsoft·机器人·aigc·copilot
用户3721574261352 小时前
如何使用 Java 提取 PPT 中的文字:整份文档、指定幻灯片与表格内容
java
ManageEngineITSM2 小时前
工单优先级怎么定?影响×紧急度矩阵的设计与落地方法
java·大数据·运维·前端·数据库·变更管理