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 脚本的编写变得更加得心应手。

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

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

相关文章

Docker 部署 ClickHouse 教程

Docker 部署 ClickHouse 教程 背景 ClickHouse 是一个开源的列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;主要用于在线分析处理&#xff08;OLAP&#xff09;。它专为大数据的实时分析设计&#xff0c;支持高速的查询性能和高吞吐量。ClickHouse 以其高效的数…

建表注意事项(2):表约束,主键自增,序列[oracle]

没有明确写明数据库时,默认基于oracle 约束的分类 用于确保数据的完整性和一致性。约束可以分为 表级约束 和 列级约束&#xff0c;区别在于定义的位置和作用范围 复合主键约束: 主键约束中有2个或以上的字段 复合主键的列顺序会影响索引的使用&#xff0c;需谨慎设计 添加…

Google C++ Style / 谷歌C++开源风格

文章目录 前言1. 头文件1.1 自给自足的头文件1.2 #define 防护符1.3 导入你的依赖1.4 前向声明1.5 内联函数1.6 #include 的路径及顺序 2. 作用域2.1 命名空间2.2 内部链接2.3 非成员函数、静态成员函数和全局函数2.4 局部变量2.5 静态和全局变量2.6 thread_local 变量 3. 类3.…

【HTML入门】Sublime Text 4与 Phpstorm

文章目录 前言一、环境基础1.Sublime Text 42.Phpstorm(1)安装(2)启动Phpstorm(3)“启动”码 二、HTML1.HTML简介(1)什么是HTML(2)HTML版本及历史(3)HTML基本结构 2.HTML简单语法(1)HTML标签语法(2)HTML常用标签(3)表格(4)特殊字符 总结 前言 在当今的软件开发领域&#xff0c…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.20 傅里叶变换:从时域到频域的算法实现

2.20 傅里叶变换&#xff1a;从时域到频域的算法实现 目录 #mermaid-svg-zrRqIme9IEqP6JJE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zrRqIme9IEqP6JJE .error-icon{fill:#552222;}#mermaid-svg-zrRqIme9IEqP…

刷题记录 动态规划-7: 63. 不同路径 II

题目&#xff1a;63. 不同路径 II 难度&#xff1a;中等 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角&#xff08;即 grid[0][0]&#xff09;。机器人尝试移动到 右下角&#xff08;即 grid[m - 1][n - 1]&#xff09;。机器人每次只能向下或者向右移动一步。…

HarmonyOS:给您的应用添加通知

一、通知介绍 通知旨在让用户以合适的方式及时获得有用的新消息&#xff0c;帮助用户高效地处理任务。应用可以通过通知接口发送通知消息&#xff0c;用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用&#xff0c;通知主要有以下使用场景&#xff1a; 显示…

Unity飞行代码 超仿真 保姆级教程

本文使用Rigidbody控制飞机&#xff0c;基本不会穿模。 效果 飞行效果 这是一条优雅的广告 如果你也在开发飞机大战等类型的飞行游戏&#xff0c;欢迎在主页搜索博文并参考。 搜索词&#xff1a;Unity游戏(Assault空对地打击)开发。 脚本编写 首先是完整代码。 using System.Co…

图论常见算法

图论常见算法 算法prim算法Dijkstra算法 用途最小生成树&#xff08;MST&#xff09;&#xff1a;最短路径&#xff1a;拓扑排序&#xff1a;关键路径&#xff1a; 算法用途适用条件时间复杂度Kruskal最小生成树无向图&#xff08;稀疏图&#xff09;O(E log E)Prim最小生成树无…

车载软件架构 --- 基于AUTOSAR软件架构的ECU开发流程小白篇

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

Linux 传输层协议 UDP 和 TCP

UDP 协议 UDP 协议端格式 16 位 UDP 长度, 表示整个数据报(UDP 首部UDP 数据)的最大长度如果校验和出错, 就会直接丢弃 UDP 的特点 UDP 传输的过程类似于寄信 . 无连接: 知道对端的 IP 和端口号就直接进行传输, 不需要建立连接不可靠: 没有确认机制, 没有重传机制; 如果因…

Android学习21 -- launcher

1 前言 之前在工作中&#xff0c;第一次听到launcher有点蒙圈&#xff0c;不知道是啥&#xff0c;当时还赶鸭子上架去和客户PK launcher的事。后来才知道其实就是安卓的桌面。本来还以为很复杂&#xff0c;毕竟之前接触过windows的桌面&#xff0c;那叫一个复杂。。。 后面查了…

unity学习26:用Input接口去监测: 鼠标,键盘,虚拟轴,虚拟按键

目录 1 用Input接口去监测&#xff1a;鼠标&#xff0c;键盘&#xff0c;虚拟轴&#xff0c;虚拟按键 2 鼠标 MouseButton 事件 2.1 鼠标的基本操作 2.2 测试代码 2.3 测试情况 3 键盘Key事件 3.1 键盘的枚举方式 3.2 测试代码同上 3.3 测试代码同上 3.4 测试结果 4…

简单介绍一下什么是OpenFeign

OpenFeign是什么&#xff1f; OpenFeign是一个声明式的Http客户端&#xff0c;它可以用来发起Http请求 它主要用于SpringCloud微服务之间的通讯&#xff0c;让调用另一个服务的Java方法和调用本地方法一样快速和便捷 之前我们是用RestTemplate写一大堆东西发起Http请求远程调…

Hugging Face GGUF 模型可视化

Hugging Face GGUF 模型可视化 1. Finding GGUF files (检索 GGUF 模型)2. Viewer for metadata & tensors info (可视化 GGUF 模型)References 无知小儿&#xff0c;仙家雄霸天下&#xff0c;依附强者才是唯一的出路。否则天地虽大&#xff0c;也让你们无路可走&#xff0…

Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践

title: Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践 date: 2025/2/4 updated: 2025/2/4 author: cmdragon excerpt: PostgreSQL 作为开源关系型数据库的佼佼者,因其强大的功能与性能被广泛应用于各种项目中。而 Python 则因其简洁易用的语法、丰富的库和强大的…

生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (上)

今天小李哥将开启全新的技术分享系列&#xff0c;为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来&#xff0c;生成式 AI 安全市场正迅速发展。据 IDC 预测&#xff0c;到 2025 年全球 AI 安全解决方案市场规模将突破 200 亿美元&#xff0c;年复合增长率超过 30%…

《LLM大语言模型深度探索与实践:构建智能应用的新范式,融合代理与数据库的高级整合》

文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…

开发板上Qt运行的环境变量的三条设置语句的详解

在终端中运行下面三句命令用于配置开发板上Qt运行的环境变量&#xff1a; export QT_QPA_GENERIC_PLUGINStslib:/dev/input/event1 export QT_QPA_PLATFORMlinuxfb:fb/dev/fb0 export QT_QPA_FONTDIR/usr/lib/fonts/设置成功后可以用下面的语句检查设置成功没有 echo $QT_QPA…