Shell逻辑判断备忘录

目录

条件测试语法详解-三种测试工具))

[单中括号 ](#单中括号 [ ])

[双中括号 \[ ]](#双中括号 [[ ]])

[双小括号 (( ))](#双小括号 (( )))

常用运算符速查表

流程控制结构

[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

最佳实践

  1. 优先使用[[ ]]替代[ ]
  2. 数字比较用(( ))语法
  3. 变量始终加引号:"$var"
  4. 关键逻辑添加注释说明
  5. 测试边界条件(空值、特殊字符等)

系统信息检测脚本

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
相关推荐
深海鱼在掘金2 天前
Git 完全指南 —— 第1章:Git 概览与版本控制演进
git
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz2 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_2 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈2 天前
Unix 与 Linux 异同小叙
linux·服务器·unix
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造