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
相关推荐
月光技术杂谈1 小时前
国内环境下安装 docker-ce 的完整步骤
运维·docker·容器
Bdygsl1 小时前
Git(2)—— 分支管理
git
skywalk81631 小时前
Trae生成的中文编程语言关键字(如“定“、“函“、“印“等)需要和标识符之间用 空格 隔开,以确保正确识别
服务器·开发语言·编程
焦糖玛奇朵婷2 小时前
健身房预约小程序开发、设计
java·大数据·服务器·前端·小程序
Leida_wanglin2 小时前
工作经验-问题总结
运维
其实防守也摸鱼2 小时前
软件安全与漏洞--软件安全设计
运维·网络·安全·网络安全·密码学·需求分析·软件安全
Liangwei Lin2 小时前
LeetCode 76. 最小覆盖子串
运维·服务器
Mortalbreeze3 小时前
深度理解进程----进程状态
linux·运维·服务器
艾莉丝努力练剑3 小时前
【Linux网络】Linux 网络编程入门:TCP Socket 编程(下)
linux·运维·服务器·网络·c++·tcp/ip