Shell脚本-条件判断相关参数

一、前言

在 Shell 脚本编程中,条件判断 是实现流程控制的核心机制之一。无论是判断文件是否存在、字符串是否相等,还是数值大小比较,都离不开条件判断语句。

本文将带你全面掌握 Shell 脚本中与条件判断相关的参数和语法,包括:

✅ 文件状态判断参数
✅ 字符串比较操作符
✅ 数值比较操作符
✅ 逻辑运算符(与、或、非)
✅ 在 ifwhilecase 中的使用方法
✅ 实战案例:脚本参数校验、文件监控、系统检查
✅ 常见陷阱与最佳实践

并通过完整代码示例帮助你写出更健壮、可靠的 Shell 脚本。

二、Shell 条件判断的基本语法

Shell 中最常用的条件判断结构是 if 语句,配合 test 命令或 [ ][[ ]] 结构使用。

✅ 基本语法:

if [ condition ]; then# 执行语句
elif [ condition ]; then# 执行语句
else# 执行语句
fi

📌 注意:[ ] 两边必须有空格,否则会报错。

三、文件状态判断参数

这些参数用于判断文件或目录的存在性、类型和权限。

参数含义示例
-e文件或目录存在[ -e /etc/passwd ]
-f是普通文件[ -f script.sh ]
-d是目录[ -d /tmp ]
-r可读[ -r config.txt ]
-w可写[ -w log.txt ]
-x可执行[ -x /usr/bin/python ]
-s文件非空(大小 > 0)[ -s data.txt ]
-L是符号链接[ -L link ]

✅ 示例:检查配置文件是否存在

#!/bin/bashCONFIG="/etc/app.conf"if [ -f "$CONFIG" ]; thenecho "配置文件存在,正在加载..."
elseecho "错误:配置文件 $CONFIG 不存在!"exit 1
fi

四、字符串比较操作符

操作符含义示例
= 或 ==字符串相等[ "$name" = "Alice" ]
!=字符串不相等[ "$name" != "Bob" ]
-z字符串为空(长度为0)[ -z "$input" ]
-n字符串非空[ -n "$input" ]

⚠️ 注意:字符串比较时建议使用双引号包裹变量,防止空值导致语法错误。

✅ 示例:检查用户输入

#!/bin/bashread -p "请输入用户名: " usernameif [ -z "$username" ]; thenecho "用户名不能为空!"exit 1
elif [ "$username" = "admin" ]; thenecho "欢迎管理员!"
elseecho "欢迎用户 $username"
fi

五、数值比较操作符

操作符含义示例
-eq等于[ $age -eq 18 ]
-ne不等于[ $age -ne 20 ]
-lt小于[ $num -lt 10 ]
-le小于等于[ $num -le 10 ]
-gt大于[ $num -gt 5 ]
-ge大于等于[ $num -ge 5 ]

❗ 注意:数值比较必须使用 -eq-lt 等专用操作符,不能用 ==>

✅ 示例:判断进程数量

#!/bin/bashcount=$(ps aux | grep nginx | grep -v grep | wc -l)if [ $count -eq 0 ]; thenecho "Nginx 未运行"
elif [ $count -ge 2 ]; thenecho "检测到多个 Nginx 进程"
elseecho "Nginx 正常运行"
fi

六、逻辑运算符

操作符含义示例
!非(取反)[ ! -f file.txt ]
-a与(and)[ -f file.txt -a -r file.txt ]
-o或(or)[ -f file1.txt -o -f file2.txt ]

🔁 推荐使用 [[ ]] 支持更直观的 &&||

✅ 示例:组合判断

# 使用 [ ] 和 -a
if [ -f "$file" ] && [ -r "$file" ]; thenecho "文件存在且可读"
fi# 使用 [[ ]] 更简洁
if [[ -f "$file" && -r "$file" ]]; thenecho "文件存在且可读"
fi

七、实战案例:编写健壮的启动脚本

📌 需求背景:

编写一个脚本,启动服务前进行多项检查:

  1. 配置文件存在且可读
  2. 日志目录存在且可写
  3. 用户输入确认

✅ 实现脚本:

#!/bin/bashCONFIG="/etc/myapp.conf"
LOG_DIR="/var/log/myapp"
PID_FILE="/var/run/myapp.pid"# 检查配置文件
if [ ! -f "$CONFIG" ] || [ ! -r "$CONFIG" ]; thenecho "错误:配置文件 $CONFIG 不存在或不可读!"exit 1
fi# 检查日志目录
if [ ! -d "$LOG_DIR" ] || [ ! -w "$LOG_DIR" ]; thenecho "错误:日志目录 $LOG_DIR 不存在或不可写!"exit 1
fi# 确认启动
read -p "确定要启动服务吗?(y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; thenecho "已取消启动。"exit 0
fi# 启动服务(模拟)
echo "正在启动服务..."
# /usr/bin/myapp --config "$CONFIG" &echo "服务启动成功!"

八、常见陷阱与最佳实践

问题原因解决方案
[: too many arguments变量含空格未加引号使用 "$var" 包裹变量
数值比较失败使用 == 而非 -eq使用 -eq-lt 等专用操作符
空变量导致语法错误未加引号所有变量都用双引号包裹
逻辑判断混乱优先级不清使用 [[ ]] 或明确加括号
文件路径含特殊字符未正确转义使用变量并加引号

九、总结对比表:Shell 条件判断参数一览

类型参数/操作符说明
文件判断-e-f-d判断文件/目录存在性
-r-w-x判断读写执行权限
-s判断文件非空
字符串=!=字符串相等/不等
-z-n判断字符串为空/非空
数值-eq-ne-lt-gt 等数值比较
逻辑!-a-o非、与、或
&&, `

十、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93365.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

何为“低空经济”?

低空经济(Low-Altitude Economy)是指以1000米以下空域(部分场景可延伸至3000米)为核心,以无人机(UAV)、电动垂直起降飞行器(eVTOL)、直升机、通航飞机等航空器为载体&…

线性代数 | 直观理解一些概念

注:本文为 “线性代数 直观理解概念” 相关合辑。 英文引文,机翻未校。 中文引文,略作重排。 如有内容异常,请看原文。 直观理解线性代数的一些概念 2015-03-06 Updated: 2015-05-09 本文介绍矩阵的一些相关概念的直观理解&…

Spring AI 集成阿里云百炼平台

Spring AI 集成阿里云百炼平台 创建API key 在阿里云百炼平台创建API key设置系统变量。阿里云百炼 api key 创建 API 参考 官方API地址:https://bailian.console.aliyun.com (1)在阿里云百炼控制台,选择API参考菜单。 API…

Codeforces Round 859 (Div. 4) A - D + F - G2 题解

Codeforces Round 859 (Div. 4) A - D F - G2 题解A. Plus or Minus&#xff08;800 分难度&#xff09; 思路&#xff1a; 直接 if - else 判断。 参考代码&#xff1a; #include<bits/stdc.h> using namespace std; void solve(){int a, b, c;cin >> a >&g…

【Java web】Servlet 详解

一、什么是 Servlet&#xff1f;—— 你不知道的 "网页服务员"想象你走进一家网红书店&#xff08;比如 "在线 Java 书店"&#xff09;&#xff0c;想买一本《Java 编程思想》。你告诉前台服务员你的需求&#xff0c;服务员去仓库找书、包装、收款&#xf…

数据库Microsoft Access、SQL Server和SQLite三者对比及数据库的选型建议

SQLite本质是代码库&#xff0c;Access是单文件桌面DB&#xff0c;SQL Server是正经的C/S架构数据库。这就像比较自行车、家用轿车和卡车&#xff0c;完全不同的设计目标。 核心区别对比表特性Microsoft AccessSQL ServerSQLite类型桌面DBMS (文件型)客户端/服务器 RDBMS嵌入式…

【C++】默认构造函数,参数化构造函数,拷贝构造函数,拷贝赋值运算符, 移动构造函数 ,移动赋值运算符

1. 默认构造函数 (Default Constructor) 作用&#xff1a; 无参创建对象 签名&#xff1a; ClassName() 特点&#xff1a; ①无参数或所有参数都有默认值 ②若未声明任何构造函数&#xff0c;编译器自动生成&#xff08;空实现&#xff09; ③用于容器默认初始化&#xff08;如…

办公效率提升指南:完成重复任务自动化

手动操作容易出错&#xff0c;尤其是在处理大量数据或复杂文档时。它将PDF转换、Word处理、Excel操作、OCR识别等高频功能融为一体&#xff0c;界面清爽无冗余&#xff0c;零广告打扰&#xff0c;专注提升工作效率。它内置七大核心模块&#xff1a;自动任务、系统工具、文件处理…

数字炼金术:当API工作流遇见AI客服—点石成金的智能革命!

目录 引言 一、蓝耘元生代MaaS平台概述 1.1 蓝耘平台的API服务 1.2 蓝耘平台的优势 二、初识蓝耘元生代MaaS平台—带你深度体验 2.1 从零开始——平台注册与环境搭建 2.2 蓝耘平台的优势在哪里&#xff1f; 三、API工作流调用技巧与实践 3.1 API工作流设计与调用流程 …

HackMyVM-Uvalde

目录信息搜集漏洞利用权限提升信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.21.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-16 01:10 EDT Nmap scan report for dev.medusa.hmv (192.168.21.6) Host is up (0.00015s latency). MAC Addr…

「Java EE开发指南」如何使用MyEclipse中的Web Fragment项目?

开发者可以通过使用Web Fragment项目模块化应用程序部署描述符&#xff0c;本文提供如何使用它们的必要信息。 该特性在MyEclipse中可用。 MyEclipse v2025.1离线版下载 通过使用Web Fragment项目&#xff0c;您的Web应用程序部署描述符可以模块化&#xff0c;就像能够模块化…

redis的key过期删除策略和内存淘汰机制

一、key的过期删除策略 原由&#xff1a;一般情况下&#xff0c;在使用redis作缓存&#xff0c;对k设置过期时间&#xff0c;当过期时间到后&#xff0c;k还是占用内存的&#xff0c;并没有从内存中移除。 1.定时删除 在设置key的过期时间的同时&#xff0c;为该key创建一个定…

NVIDIA Nsight Deep Learning Designer使用

一、关于产品 1.1 产品介绍 NVIDIA Nsight Deep Learning Designer 是一款面向 AI 推理开发者的可视化建模与优化工具。它支持基于 ONNX 格式的神经网络模型编辑、结构可视化、性能分析与 TensorRT 引擎导出&#xff0c;帮助用户更高效地设计、调优和部署高性能推理模型。该工…

Android 常见100道面试题(完整版)

一、基础组件与核心原理Activity 相关Q1&#xff1a;请描述 Activity 的完整生命周期&#xff0c;从创建到销毁经历哪些关键方法&#xff1f;A&#xff1a;Activity 完整生命周期包括&#xff1a;onCreate&#xff08;初始化&#xff09;→ onStart&#xff08;可见&#xff09…

Navicat 为 SQLite 数据库设置密码指南

Navicat 为 SQLite 数据库设置密码指南 在 SQLite 中设置密码实际上是通过加密实现的&#xff0c;Navicat 使用 SQLCipher 扩展来提供数据库加密功能。以下是详细的操作方法和注意事项&#xff1a; 在 Navicat 中设置密码&#xff08;加密数据库&#xff09; 步骤 1&#xff1a…

Spring Framework:Java 开发的基石与 Spring 生态的起点

在 Java 技术领域&#xff0c;Spring Framework 无疑是一座里程碑式的存在。它不仅彻底改变了 Java 企业级应用的开发模式&#xff0c;更以其为核心衍生出了庞大的 Spring 生态系统&#xff0c;成为无数开发者构建应用的首选技术栈。本文将以 Spring Framework 为核心&#xff…

Unity中 terriaria草,在摄像机拉远的时候就看不见了,该怎么解决

在 Unity 中&#xff0c;当摄像机拉远时草就看不见&#xff0c;可能是由于地形细节距离设置、摄像机裁剪平面设置或 LOD&#xff08;Level of Detail&#xff09;设置不当导致的。以下是具体的解决方法&#xff1a;调整地形细节距离&#xff1a;选中场景中的地形对象&#xff0…

驱动开发系列63 - 编译 NVIDIA 的 open-gpu-kernel-modules 开源内核驱动及搭建调试环境

目录 一:通过apt方式安装nvidia 驱动 二:通过 .run 方式安装nvidia驱动 三:编译安装nvidia开源内核驱动 四:验证和调试 五:卸载驱动 1. 以apt方式安装nvidia 驱动的卸载方法 2. 以.run方式安装nvidia驱动的卸载方法 六:安装CUDA环境 一:通过apt方式安装nvidia 驱动…

Rocky Linux 9.2:从 /home 分区释放 10G 空间扩容到 / 根分区

在日常运维中&#xff0c;常见的问题之一就是安装的软件过多&#xff0c;导致根分区&#xff08;/&#xff09;空间不足&#xff0c;而其他分区&#xff08;例如 /home&#xff09;却有大量闲置空间。本文将演示如何在 Rocky Linux 9.2 上&#xff0c;通过 LVM&#xff08;Logi…

iis/iis express无需手动配置handlers,仅将 DLL 放入bin目录即可处理 HTTP 请求的功能

以下是使用VB.NET实现的方案&#xff0c;分别针对传统ASP.NET&#xff08;System.Web&#xff09;和ASP.NET Core 两种环境&#xff0c;实现无需手动配置handlers&#xff0c;仅将 DLL 放入bin目录即可处理 HTTP 请求的功能。 一、传统ASP.NET&#xff08;System.Web&#xff…