Shell基础:中括号的使用
在Shell脚本中,中括号([ ... ] 和 [[ ... ]])是一种常见的条件测试结构。它们用于进行文件类型检查、值比较以及逻辑判断。通过了解它们的不同特点和用法,能够帮助你编写更加高效、安全且易读的脚本。本文将详细介绍Shell中单中括号和双中括号的区别、语法、常见用法及一些注意事项。
单中括号
单中括号([ ... ])也叫做 test 命令,它是Shell中最基本的条件判断工具之一。这个结构用于测试文件属性、比较数值和字符串,以及进行简单的逻辑判断。
有些人可能会感到困惑,为什么一个是符号,另一个是命令,二者却可以等价。其实,原理很简单:当Shell遇到左中括号([)时,它会将其视作一个命令,并将中括号内的内容作为 test 命令的参数来解析,直到遇到右中括号(])为止。因此,[ ... ] 其实就是 test 命令的一种简写形式。
1. 基本语法
单中括号的基本语法如下:
[ expression ]
在单中括号中,expression 代表一个条件表达式。其返回值为真(0)或假(1),这通常用于 if 语句的条件判断中。例如:
if [ "$var" == "hello" ]; thenecho "字符串匹配"
fi
2. 使用限制与特点
- 空格要求:在
[和]之间以及表达式的各个元素之间需要留有空格。例如,[ $x -gt 10 ]是正确的,而[ $x-gt 10]会报错。 - 特殊字符需要转义:在单中括号中,一些特殊字符(如
<,>,|等)需要使用反斜杠(\)进行转义。
下面重点介绍双中括号,因为它更现代、更强大。
双中括号
双中括号([[ ... ]])是Bash中引入的一种条件测试结构。它比传统的 [ ... ](即 test 命令)更加强大和灵活。双中括号不仅支持更多的比较操作符,还具备更强的语法功能和更少的限制,使得它成为编写Bash脚本时更推荐使用的工具。
1. 基本语法
双中括号的基本语法如下:
[[ expression ]]
它和 [ ... ] 类似,但有许多额外的功能和改进。最常见的用法包括字符串比较、数值比较、文件测试等。
2. 与单中括号的区别
-
扩展的比较操作符:
双中括号支持更多的比较操作符。例如,字符串的模式匹配、正则表达式匹配等。 -
无需转义特殊字符:
在双中括号中,许多特殊字符(如<,>,|等)不需要像[ ... ]中那样进行转义。 -
支持逻辑运算符:
双中括号允许直接使用&&(与)、||(或)等逻辑运算符来组合多个条件。 -
无需引号保护字符串和变量:
在[[ ... ]]中,空格或特殊字符的字符串和变量无需额外的引号保护。即使字符串中包含空格,它也能正确处理。
3. 常用操作符
3.1 字符串比较
-
==:匹配字符串(支持模式匹配)if [[ "$str" == "hello" ]]; thenecho "字符串匹配成功" fi -
!=:不匹配字符串if [[ "$str" != "world" ]]; thenecho "字符串不匹配" fi -
=~:匹配正则表达式(需注意正则表达式与grep的略微不同)if [[ "$str" =~ ^[0-9]+$ ]]; thenecho "字符串只包含数字" fi
3.2 数值比较
与 [ ... ] 中使用的数值比较类似,双中括号也提供了数值比较操作符:
-eq:等于-ne:不等于-lt:小于-le:小于或等于-gt:大于-ge:大于或等于
x=10
y=20
if [[ $x -lt $y ]]; thenecho "$x 小于 $y"
fi
3.3 文件测试操作符
-e:文件存在-d:是目录-f:是普通文件-r:可读-w:可写-x:可执行-s:文件非空-L:是符号链接
if [[ -e "$file" ]]; thenecho "文件存在"
fi
4. 逻辑运算符
&&:逻辑与运算符,两个条件都成立时返回真。||:逻辑或运算符,两个条件中只要有一个成立就返回真。!:逻辑非运算符,反转条件的真假。
例如:
if [[ $x -gt 10 && $x -lt 20 ]]; thenecho "$x 在 10 到 20 之间"
fiif [[ $x -le 10 || $x -ge 20 ]]; thenecho "$x 小于等于 10 或大于等于 20"
fiif [[ ! -e "$file" ]]; thenecho "文件不存在"
fi
5. [[ ... ]] 内部的模式匹配
Bash中的 [[ ... ]] 还支持通配符模式匹配,这对于字符串匹配尤为有用。
*:匹配零个或多个字符?:匹配一个字符[...]:匹配字符集中的一个字符
示例:
filename="test_file.txt"
if [[ "$filename" == *.txt ]]; thenecho "这是一个文本文件"
fiif [[ "$filename" == test_?ile.txt ]]; thenecho "这是符合模式的文件名"
fi
6. [[ ... ]] 的优点
- 更安全:
[[ ... ]]可以自动处理字符串中的空格和特殊字符,无需像[ ... ]那样手动引用字符串。 - 更强大:提供了正则表达式支持、模式匹配等功能,能够处理更复杂的条件判断。
- 更简洁:
[[ ... ]]允许直接使用&&和||连接多个条件,而无需像[ ... ]那样使用转义字符。
7. 常见错误与陷阱
尽管 [[ ... ]] 更加灵活和安全,但仍然需要注意一些常见的错误。
下面的例子演示了由于没有加引号,导致的通配符绕过问题:
read -p "请输入密码: " user_input
correct_password="secret123"if [[ $user_input == $correct_password ]]; thenecho "密码匹配成功"
elseecho "密码错误"
fi
在这个例子中,如果用户输入了 * 作为密码,Shell 会将 * 作为通配符,匹配任意字符,从而意外地使密码验证成功。
为了解决这个问题,应该始终使用引号将变量包裹起来,确保其内容不被Shell解释为通配符或其他特殊字符:
read -p "请输入密码: " user_input
correct_password="secret123"if [[ "$user_input" == "$correct_password" ]]; thenecho "密码匹配成功"
elseecho "密码错误"
fi
通过正确使用引号,我们能够防止通配符等特殊字符的干扰,确保变量内容按字面意义进行比较。
8. 小结
[[ ... ]]是Bash中用于条件判断的高级结构,比[ ... ]提供了更多的功能和更高的灵活性。- 它支持更多的比较操作符、模式匹配、正则表达式,并且能够处理字符串中的空格和特殊字符。
- 使用
[[ ... ]]可以编写更安全、简洁且易于维护的脚本,尤其是在处理复杂条件时。
掌握了 [[ ... ]] 的用法,你会发现 Bash 脚本的编写变得更加得心应手。
相关文章:
Shell基础:中括号的使用
在Shell脚本中,中括号([ ... ] 和 [[ ... ]])是一种常见的条件测试结构。它们用于进行文件类型检查、值比较以及逻辑判断。通过了解它们的不同特点和用法,能够帮助你编写更加高效、安全且易读的脚本。本文将详细介绍Shell中单中括…...
《基于Scapy的综合性网络扫描与通信工具集解析》
在网络管理和安全评估中,网络扫描和通信是两个至关重要的环节。Python 的 Scapy 库因其强大的网络数据包处理能力,成为开发和实现这些功能的理想工具。本文将介绍一个基于 Scapy 编写的 Python 脚本,该脚本集成了 ARP 扫描、端口扫描以及 TCP…...
面经--C语言——sizeof和strlen,数组和链表,#include <>和 #include ““ #define 和typedef 内存对齐概述
文章目录 sizeof 和 strlen数组和链表总结 #include <>和 #include ""#define 和typedef内存对齐概述对齐规则示例:结构体的内存对齐分析: 内存对齐的常见规则:填充字节的计算对齐影响的实际例子 sizeof 和 strlen 特性size…...
使用 Kotlin 将 Vertx 和 Springboot 整合
本篇文章目的是将 Springboot 和 Vertx 进行简单整合。整合目的仅仅是为了整活,因为两个不同的东西整合在一起提升的性能并没有只使用 Vertx 性能高,因此追求高性能的话这是在我来说不推荐。而且他们不仅没有提高很多性能甚至增加了学习成本 一、整合流…...
线性回归算法-01
线性回归简介 学习目标 了解线性回归的应用场景知道线性回归的定义 1 线性回归应用场景 房价预测销售额度预测贷款额度预测 2 什么是线性回归 2.1 定义与公式 线性回归(Linear regression)是利用 回归方程(函数)对 一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模…...
洛谷 P1130 红牌 C语言
题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂,一共包括 N 个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程,每一步政府都派了 M 个工作人员来检查材料。不幸的是&…...
虚幻UE5手机安卓Android Studio开发设置2025
一、下载Android Studio历史版本 步骤1:虚幻4.27、5.0、5.1、5.2官方要求Andrd Studio 4.0版本; 5.3、5.4、5.5官方要求的版本为Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023 虚幻官网查看对应Andrd Studiob下载版本: https:/…...
线性代数复习笔记
1. 课程学习 1.1 3Blue1Brown 线性代数 2. 基本术语 eigenvector(特征向量):线性变换中方向保持不变的向量 可以视作3D旋转矩阵形成的旋转的轴...
你需要更深层次的解放
先谈一谈理性认知中的属性替换原则。简单来说,属性替换就是用简单的问题取代难题。 当人们需要评估属性A时,却发现评估属性B更容易一些(A与B之间存在一定的关系),于是就改为评估属性B。这叫做属性替换。 作为一种认知…...
机器学习算法在网络安全中的实践
机器学习算法在网络安全中的实践 本文将深入探讨机器学习算法在网络安全领域的应用实践,包括基本概念、常见算法及其应用案例,从而帮助程序员更好地理解和应用这一领域的技术。"> 序言 网络安全一直是信息技术领域的重要议题,随着互联…...
Qt事件处理:理解处理器、过滤器与事件系统
1. 事件 事件 是一个描述应用程序中、发生的某些事情的对象。 在 Qt 中,所有事件都继承自 QEvent ,并且每个事件都有特定的标识符,如:Qt::MouseButtonPress 代表鼠标按下事件。 每个事件对象包含该事件的所有相关信息ÿ…...
DeepSeek相关技术整理
相关介绍 2024年12月26日,DeepSeek V3模型发布(用更低的训练成本,训练出更好的效果)671B参数,激活37B。2025年1月20日,DeepSeek-R1模型发布(仅需少量标注数据(高质量长cotÿ…...
DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”
当算力博弈升级为网络战争:拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下,网络已然成为人类社会运转的关键基础设施,深刻融入经济、生活、政务等各个领域。从金融交易的实时清算…...
蓝桥杯之c++入门(二)【输入输出(上)】
目录 前言1.getchar和 putchar1.1 getchar()1.2 putchar() 2.scanf和 printf2.1 printf2.1.1基本用法2.1.2占位符2.1.3格式化输出2.1.3.1 限定宽度2.1.3.2 限定小数位数 2.2 scanf2.2.1基本用法2.2.2 占位符2.2.3 scanf的返回值 2.3练习练习1:…...
消息队列应用示例MessageQueues-STM32CubeMX-FreeRTOS《嵌入式系统设计》P343-P347
消息队列 使用信号量、事件标志组和线标志进行任务同步时,只能提供同步的时刻信息,无法在任务之间进行数据传输。要实现任务间的数据传输,一般使用两种方式: 1. 全局变量 在 RTOS 中使用全局变量时,必须保证每个任务…...
算法题(55):用最少数量的箭引爆气球
审题: 本题需要我们找到最少需要的箭数,并返回 思路: 首先我们需要把本题描述的问题理解准确 (1)arrow从x轴任一点垂直射出 (2)一旦射出,无限前进 也就是说如果气球有公共区域(交集&…...
谭浩强C语言程序设计(4) 8章(下)
1、输入三个字符串按照字母顺序从小到大输出 #include <cstdio> // 包含cstdio头文件,用于输入输出函数 #include <cstring> // 包含cstring头文件,用于字符串处理函数#define N 20 // 定义字符串的最大长度为20// 函数:…...
AlexNet论文代码阅读
论文标题: ImageNet Classification with Deep Convolutional Neural Networks 论文链接: https://volctracer.com/w/BX18q92F 代码链接: https://github.com/dansuh17/alexnet-pytorch 内容概述 训练了一个大型的深度卷积神经网络…...
62.病毒在封闭空间中的传播时间|Marscode AI刷题
1.题目 问题描述 在一个封闭的房间里摆满了座位,每个座位东西向和南北向都有固定 1 米的间隔。座位上坐满了人,坐着的人可能带了口罩,也可能没有带口罩。我们已经知道房间里的某个人已经感染了病毒,病毒的传播速度是每秒钟感染距…...
Elixir语言的安全开发
Elixir语言的安全开发 引言 在当今这个互联网高度发展的时代,软件的安全性变得越来越重要。随着网络攻击的增多,软件漏洞的频繁暴露,开发者面临着前所未有的安全挑战。Elixir,作为一种现代化的函数式编程语言,以其高…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
