目录
一、条件测试操作
1. 文件测试
命令格式:test 操作符 文件路径 或 [ 操作符 文件路径 ]
常用操作符:
操作符 作用 示例 -e文件/目录是否存在 [ -e /tmp/file ]-f是否为普通文件 [ -f ~/data.txt ]-d是否为目录 [ -d /var/log ]-r是否可读 [ -r file ]-w是否可写 [ -w file ]-x是否可执行 [ -x script.sh ]-s文件大小是否非空 [ -s log.txt ]-L是否为符号链接 [ -L /usr/bin/python ]注意: 测试命令(执行完后面一般跟“ echo $?”判断测试结果)
[ ” 或 “ ]”之间至少用一个空格分隔
分隔符 : "&&"表示”而且“的关系,前面命令成功后执行后面命令,一般结合 ”echo ”
“||”表示“或者”,条件成立一个就可以
2. 整数值比较
语法:
[ 数值1 操作符 数值2 ]或(( 数值1 操作符 数值2 ))操作符:
操作符 作用 示例 -eq等于 [ $a -eq 10 ]-ne不等于 [ $count -ne 0 ]-gt大于 [ $num -gt 100 ]-ge大于等于 [ $score -ge 60 ]-lt小于 [ $age -lt 18 ]-le小于等于 [ $size -le 1024 ]- 注意:仅支持整数比较,浮点数需借助
bc命令。
(( )) 是 Bash 的算术运算语法,可直接用 >、< 等符号:
3. 字符串比较
语法:
[ "字符串1" 操作符 "字符串2" ]操作符:
操作符 作用 示例 =字符串相等 [ "$str" = "hello" ]!=字符串不等 “!”为取反 [ "$mode" != "debug" ]-z字符串长度为 0(空) [ -z "$input" ]-n字符串长度非 0(非空) [ -n "$username" ]注意:双引号包裹(避免空值导致语法错误):
[ "$var" = "value" ] # 正确 [ $var = "value" ] # 若 $var 为空,等价于 [ = "value" ],报错
4. 逻辑测试
语法:组合多个条件
| 逻辑符 | 作用 | 示例 |
|---|---|---|
-a 或 && |
逻辑与(AND) | [ 条件1 -a 条件2 ] 或 条件1 && 条件2 |
-o 或 || |
逻辑或(OR) | [ 条件1 -o 条件2 ] 或 条件1 || 条件2 |
! |
逻辑否(NOT) | [ ! -f file ] |
注意:-a 、-o ,使用test测试时才用;"&&"表示”而且“的关系,前面命令成功后执行后面命令, 两个条件必须都满足,“||”表示“或者”,条件成立一个整个命令都成立,“!”指定条件不成立。以上满足后整个测试命令才会返回值为0.
二、if 条件语句
1.结构
(1)单分支 if 语句
格式:
if 条件测试操作 ;
then
命令虚列
fi
流程:
(2)双分支 if 语句
格式:
if 条件 ;
then
命令1
else
命令2
fi
流程:
(3)多分支 if 语句
格式
if 条件1 ;
then
命令A
elif 条件2 ;
then
命令B
else
命令C
fi
流程:
2.应用示例
(1)单分支 if 语句应用
内存告警示例:
#!/bin/bash
if [ $(free | awk '/Mem/{print $4}') -lt 524288 ];
then
echo "内存不足500MB!" >&2 # 将告警信息输出到标准错误流
fi
注释:
通过
free命令获取内存信息,awk过滤出可用内存值-lt 524288判断剩余内存是否小于512MB(单位KB)>&2确保告警信息显示在终端(即使脚本输出被重定向)
(2)双分支 if 语句应用
网络联通性测试示例:
#!/bin/bash
# 定义测试目标(可修改为其他 IP 或域名)
target="8.8.8.8"
# 执行 ping 测试(Linux 用法:-c 指定次数,-W 超时时间;Mac 用法:-c 和 -t)
ping -c 3 -i 0.2 -W 2 "$target" &> /dev/null
# 双分支判断
if [ $? -eq 0 ];
then
echo "✅ 网络连通正常:主机 [$target] 可达!"
else
echo "❌ 网络连接失败:主机 [$target] 不可达!"
fi
ping 命令参数:
-c 3:发送 3 个探测包(避免无限等待)。-W 2:每次等待响应超时时间为 2 秒(Linux 参数)。-i 0.2 :连通速度
&> /dev/null:黑洞文件,丢弃所有输出(只需判断成功与否,无需显示内容)。
退出状态码
$?:$? -eq 0:表示ping命令执行成功(至少收到 1 个回复包)。$? -ne 0:表示ping失败(超时或目标不可达)。
(3)多分支 if 语句应用
成绩分级示例:
#!/bin/bash
read -p "请输入成绩(0-100):" score
if [ $score -ge 80 ] && [ $score -le 100]
then
echo "优秀" # 80-100分
elif [ $score -ge 60 ];
then
echo "合格" # 60-79分
else
echo "不合格" # 60分以下
fi
注释:
-ge用于数值比较(大于等于)条件必须从高到低排列,避免逻辑错误(如先判断≥60会包含≥90的情况)
三、case 分支语句
1. 结构
case 变量 in
模式1)
命令组1
;; # 双分号表示分支结束
模式2|模式3) # 多个模式用|分隔
命令组2
;;
*) # 通配符匹配其他所有情况
默认命令组
;;
esac # case倒写表示结构结束
流程图
2. 特点
- case行尾必须为单词“ in ”,每一模式必须以右括号 “ )”结束。
- 双分号“ ;; ”表示命令序列的结束。
- 模式字符串中:可以用方括号表示一个连续的范围,加“ [0-9] ”,还可以用竖杠符号“ | ”表示或,如“A|B”
- 最后的“ *)“表示默认模式,其中的*相当于通配符。
3. 应用示例
(1)检查用户输入的字符类型
read -p "请输入一个字符:" char
case $char in
[a-zA-Z])
echo "字母"
;;
[0-9])
echo "数字"
;;
*) ##"*)"默认模式,匹配任意字符
echo "其他字符"
;;
esac
注意:
模式
[a-zA-Z]匹配单个字母,严格匹配单个字符,输入多个字符时会触发*)分支,匹配失败。
(2)编写系统服务脚本
#!/bin/bash
case "$1" in
start)
echo "启动服务..."
if sleep 7200 &
then //在后台启动sleep进程
echo "OK"
fi
;;
stop)
echo -n "停止服务..." pkill "sleep" &> /dev/null
echo "OK" //停止sleep进程
;;
status)
if pgrep "sleep" &>/dev/null
then
echo "服务已经启动"
else
echo "服务已经停止"
fi
;;
restart)
echo "重启服务..."
$0 stop
$0 start
;;
*)
echo "用法:$0 {start|stop|restart}" #提示正确参数
exit 1 # 非正常退出
;;
esac
注释:
通过
$1获取执行参数,实现子命令功能,表示脚本的第一个参数exit 1确保输入错误参数时脚本立即终止
四、总结
一、文件测试
-e 存在 | -f 普通文件 | -d 目录
-r 可读 | -w 可写 | -x 可执行 | -s 非空文件
⚠️ 必须空格:[ -e file ](√) [-efile](×)
二、整数值比较
-eq 等于 | -ne 不等于
-gt 大于 | -lt 小于 | -ge 大于等于 | -le 小于等于
✅ 快捷写法:(( $a > $b ))(不用空格,直接运算符)
三、字符串比较
= 相等 | != 不相等 | -z 空串 | -n 非空串
🚫 致命细节:
[ "$s" = "abc" ](变量必须加引号)=两侧必须有空格
四、逻辑组合
-a 与(AND) | -o 或(OR) | ! 非(NOT)
✅ 高级写法:
[[ $a > 0 && $b < 5 ]](双中括号可用&&/||)
🚫 禁止:[ $a -gt 0 && $b -lt 5 ](单中括号只能用 -a/-o)
总结速查表
| 测试类型 | 常用操作符 | 重点注意事项 |
|---|---|---|
| 文件测试 | -e, -f, -d, -r |
检查路径是否存在、类型、权限 |
| 整数比较 | -eq, -gt, -lt |
仅支持整数,用 (( )) 可简化语法 |
| 字符串比较 | =, !=, -z, -n |
变量必须加引号,避免空值错误 |
| 逻辑测试 |
|
区分 [ ] 内逻辑符与命令连接符 |
五、if 语句
1. 单分支
if [ 条件 ]; then 命令; fi
示例:
if [ -f log.txt ]; then rm log.txt; fi
2. 双分支
if [ 条件 ]; then 命令1 else 命令2 fi
场景:
if [ $? -eq 0 ]; then echo "成功"; else echo "失败"; fi
3. 多分支
if [ 条件1 ]; then 命令A elif [ 条件2 ]; then 命令B else 命令C fi
示例:
if [ $age -lt 18 ]; then echo "未成年" elif [ $age -lt 60 ]; then echo "成年" else echo "老年" fi
| 结构 | 适用场景 | 优势 |
|---|---|---|
| if | 复杂条件判断(数值、文件、字符串) | 灵活,支持任意条件逻辑 |
| case | 固定模式匹配(如选项、字符串分类) | 简洁高效,可读性强 |
选择原则:
条件超过 3 种且为固定模式 → 优先用
case。需要判断文件/数值/逻辑组合 → 用
if。