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,作为一种现代化的函数式编程语言,以其高…...

Rust 条件语句
Rust 条件语句 在编程语言中,条件语句是进行决策和实现分支逻辑的关键。Rust 语言作为一门系统编程语言,其条件语句的使用同样至关重要。本文将详细介绍 Rust 中的条件语句,包括其基本用法、常见场景以及如何避免常见错误。 基本用法 Rust…...

小红的合数寻找
A-小红的合数寻找_牛客周赛 Round 79 题目描述 小红拿到了一个正整数 x,她希望你在 [x,2x] 区间内找到一个合数,你能帮帮她吗? 一个数为合数,当且仅当这个数是大于1的整数,并且不是质数。 输入描述 在一行上输入一…...

使用等宽等频法进行数据特征离散化
在数据分析与处理的过程中,特征离散化是一种常见的操作。通过将连续的数值型数据转换为离散类别,能够更好地处理数据,尤其是在机器学习模型中进行分类问题的建模时。离散化能够简化数据结构,减少数据噪声,并提高模型的解释性。 本文将详细介绍如何使用 pandas 库中的 cut…...

解析 Oracle 中的 ALL_SYNONYMS 和 ALL_VIEWS 视图:查找同义词与视图的基础操作
目录 前言1. ALL_SYNONYMS 视图2. ALL_VIEWS 视图3. 扩展 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 1. ALL_SYNONYMS 视图 在 Oracle 数据库中,同义词(Synonym)是对数…...

AI协助探索AI新构型的自动化创新概念
训练AI自生成输出模块化代码,生成元代码级别的AI功能单元代码,然后再由AI组织为另一个AI,实现AI开发AI的能力;用AI协助探索迭代新构型AI将会出现,并成为一种新的技术路线潮流。 有限结点,无限的连接形式&a…...

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(OLED设备层封装)
目录 OLED设备层驱动开发 如何抽象一个OLED 完成OLED的功能 初始化OLED 清空屏幕 刷新屏幕与光标设置1 刷新屏幕与光标设置2 刷新屏幕与光标设置3 绘制一个点 反色 区域化操作 区域置位 区域反色 区域更新 区域清空 测试我们的抽象 整理一下,我们应…...

【Redis】Redis 经典面试题解析:深入理解 Redis 的核心概念与应用
Redis 是一个高性能的键值存储系统,广泛应用于缓存、消息队列、排行榜等场景。在面试中,Redis 是一个高频话题,尤其是其核心概念、数据结构、持久化机制和高可用性方案。 1. Redis 是什么?它的主要特点是什么? 答案&a…...

TensorFlow 示例摄氏度到华氏度的转换(一)
TensorFlow 实现神经网络模型来进行摄氏度到华氏度的转换,可以将其作为一个回归问题来处理。我们可以通过神经网络来拟合这个简单的转换公式。 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 …...

7.DP算法
DP 在C中,动态规划(Dynamic Programming,DP)是一种通过将复杂问题分解为重叠子问题来高效求解的算法设计范式。以下是DP算法的核心要点和实现方法: 一、动态规划的核心思想 重叠子问题:问题可分解为多个重…...

Baklib构建高效协同的基于云的内容中台解决方案
内容概要 随着云计算技术的飞速发展,内容管理的方式也在不断演变。企业面临着如何在数字化转型过程中高效管理和协同处理内容的新挑战。为应对这些挑战,引入基于云的内容中台解决方案显得尤为重要。 Baklib作为创新型解决方案提供商,致力于…...