目录
[单中括号 [ ]](#单中括号 [ ])
[双中括号 [[ ]]](#双中括号 [[ ]])
[双小括号 (( ))](#双小括号 (( )))
[if 语句基础语法](#if 语句基础语法)
[case 语句基础语法](#case 语句基础语法)
逻辑判断在Shell脚本中用于根据条件执行不同操作,类似于日常生活中的条件语句。核心组件包括条件测试和流程控制
.test 命令(最基础)
最原始的写法,通过命令的退出码判断(0为真,非0为假)。
bash
test 10 -gt 5
echo $? # 输出0,表示条件为真
条件测试语法详解-三种测试工具)
单中括号 [ ]
(POSIX标准,兼容性好)
等价于 test 命令,但要注意括号内侧必须有空格。适合需要跨 Shell 环境(如 sh)运行的脚本。
示例:
bash
[ 10 -gt 5 ] # 数字比较(10大于5吗?)
[ -f "file.txt" ] # 文件测试(file.txt存在吗?)
双中括号 [[ ]]
[ ] 的增强版,支持正则匹配(=~)、更直观的逻辑运算符(&&、||),且不容易因为变量为空或包含空格而出错。
示例:
bash
[[ 10 > 5 ]] # 数字比较
[[ "file" == *.txt ]] # 通配符匹配
[[ $str == "pattern" ]] # 字符串比较
双小括号 (( ))
(数值计算专用)
专门用于整数的算术运算和比较,语法接近 C 语言,非常直观。
示例:
bash
(( 10 > 5 )) # 大于比较
(( a = 5 + 3 )) # 赋值和计算
常用运算符速查表
|--------|---------|-----------|----------------------|-----------------------|
| 类别 | 运算符 | 含义 | 示例 | 结果/环境 |
| 数值比较 | -eq | 等于 | [ 5 -eq 5 ] | 真 |
| 数值比较 | -ne | 不等于 | [ 5 -ne 3 ] | 真 |
| 数值比较 | -gt | 大于 | [ 5 -gt 3 ] | 真 |
| 数值比较 | -lt | 小于 | [ 3 -lt 5 ] | 真 |
| 数值比较 | -ge | 大于等于 | [ 5 -ge 5 ] | 真 |
| 数值比较 | -le | 小于等于 | [ 3 -le 5 ] | 真 |
| 字符串比较 | = 或 == | 字符串相等 | [ "a" = "a" ] | --- |
| 字符串比较 | != | 字符串不相等 | [ "a" != "b" ] | --- |
| 字符串比较 | -z | 字符串为空 | [ -z "str" \] | --- |
| 字符串比较 | -n | 字符串非空 | \[ -n "str" ] | --- |
| 文件测试 | -e | 文件或目录存在 | [ -e "/home" ] | --- |
| 文件测试 | -f | 是普通文件 | [ -f "test.txt" ] | --- |
| 文件测试 | -d | 是目录 | [ -d "/home" ] | --- |
| 文件测试 | -r | 文件可读 | [ -r "file.txt" ] | --- |
| 文件测试 | -w | 文件可写 | [ -w "file.txt" ] | --- |
| 文件测试 | -x | 文件可执行 | [ -x "script.sh" ] | --- |
| 逻辑运算 | -a | 逻辑与 (and) | --- | [ ] 中使用 |
| 逻辑运算 | -o | 逻辑或 (or) | --- | [ ] 中使用 |
| 逻辑运算 | ! | 逻辑非 (not) | --- | [ ] 和 [[ ]] 中使用 |
| 逻辑运算 | && | 逻辑与 | --- | [[ ]] 和命令中使用 |
| 逻辑运算 | || | 逻辑或 | --- | [[ ]] 和命令中使用 |
流程控制结构
if语句
bash
if [[ condition ]]; then
commands
elif [[ condition ]]; then
commands
else
commands
fi
case语句
bash
case $variable in
pattern1)
commands ;;
pattern2)
commands ;;
*)
default_commands ;;
esac
注意事项
- 单中括号内避免直接使用数学符号(如
>),改用-gt。 - 双中括号支持更灵活的字符串匹配(如通配符)。
- 双小括号内可直接进行数学运算,无需转义符号。
if 语句基础语法
成绩判断示例
bash
#!/bin/bash
read -p "请输入您的分数: " score
if (( score >= 90 )); then
echo "成绩优秀!"
elif (( score >= 80 )); then
echo "成绩良好!"
elif (( score >= 60 )); then
echo "成绩及格!"
else
echo "成绩不及格!"
fi
文件操作示例
bash
#!/bin/bash
file="test.txt"
if [ -f "$file" ]; then
echo "文件 $file 存在且是普通文件"
if [ -r "$file" ]; then
echo "文件可读"
fi
elif [ -d "$file" ]; then
echo "这是一个目录"
else
echo "文件不存在"
fi
网络检测示例
bash
#!/bin/bash
if ping -c 1 www.baidu.com &>/dev/null; then
echo "网络连接正常"
else
echo "网络连接异常"
fi
case 语句基础语法
bash
case 变量 in
模式1)
# 执行代码
;;
模式2)
# 执行代码
;;
*)
# 默认执行代码
;;
esac
服务控制脚本示例
bash
#!/bin/bash
echo "请选择操作:"
echo "1. 启动服务"
echo "2. 停止服务"
echo "3. 重启服务"
echo "4. 查看状态"
read -p "请输入选项(1-4): " option
case "$option" in
1|"start")
echo "正在启动服务..."
;;
2|"stop")
echo "正在停止服务..."
;;
3|"restart")
echo "正在重启服务..."
;;
4|"status")
echo "正在查看服务状态..."
;;
*)
echo "无效的选项!"
echo "请使用 1-4 或 start/stop/restart/status"
;;
esac
命令短路执行示例
bash
# 目录存在则进入,否则创建
[ -d "/data/app" ] && cd /data/app || mkdir -p /data/app
# 备份文件,如果备份失败则发送告警
cp config.txt config.txt.bak || echo "备份失败!" | mail -s "告警" admin@example.com
# 检查命令是否存在
command -v nginx &>/dev/null && echo "Nginx已安装" || echo "Nginx未安装"
常见错误修正
bash
# 错误:[10 -gt 5] → 正确:[ 10 -gt 5 ]
# 错误:[ $name="xiaobai" ] → 正确:[ "$name" = "xiaobai" ]
# 错误:[ 10 > 5 ] → 正确:[ 10 -gt 5 ] 或 (( 10 > 5 ))
# 错误:[ -z $name ] → 正确:[ -z "$name" ]
# 错误:if [ 1 -eq 1 ] → 正确:if [ 1 -eq 1 ]; then
最佳实践
- 优先使用
[[ ]]替代[ ] - 数字比较用
(( ))语法 - 变量始终加引号:
"$var" - 关键逻辑添加注释说明
- 测试边界条件(空值、特殊字符等)
系统信息检测脚本
bash
#!/bin/bash
echo "=== 系统信息检测 ==="
case "$(uname)" in
Linux) echo "操作系统: Linux" ;;
Darwin) echo "操作系统: macOS" ;;
*) echo "操作系统: 其他" ;;
esac
if df / | tail -1 | awk '{print $5}' | sed 's/%//' | (( $(cat) > 80 )); then
echo "⚠️ 磁盘空间使用超过80%!"
else
echo "磁盘空间正常"
fi
if free | grep Mem | awk '{print $3/$2 * 100}' | (( $(cat) > 75 )); then
echo "⚠️ 内存使用超过75%!"
else
echo "内存使用正常"
fi
用户管理脚本
bash
#!/bin/bash
echo "=== 用户管理 ==="
read -p "请输入用户名: " username
if id "$username" &>/dev/null; then
echo "用户 $username 已存在"
case "$(id -u "$username")" in
0) echo "这是root用户" ;;
[1-9]*) echo "这是普通用户" ;;
esac
else
echo "用户 $username 不存在"
read -p "是否创建用户 $username? (y/n): " create
if [[ "$create" =~ ^[Yy]$ ]]; then
sudo useradd "$username"
echo "用户 $username 已创建"
fi
fi