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 典型场景
- 成绩等级划分
- 判断文件类型:普通文件/目录/块设备
- 服务器多状态判断