目录
一、条件测试操作
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
。