bash:双中括号和单中括号

news/2024/11/17 15:38:47/文章来源:https://www.cnblogs.com/smartljy/p/18550619

bash:双中括号和单中括号

内容

在 Bash 中,if 语句可以使用单个中括号([)或者双中括号([[)进行条件测试。这里的 [[ 是一种更强大且推荐的语法,与单中括号相比,具有以下优点和特点:

为什么使用双中括号 [[ ]]

  1. 更强的条件测试功能

    • [[ 支持更复杂的条件测试,比如逻辑运算符(&&||)、模式匹配(== 支持通配符)和正则表达式(=~)。
    • 在你的例子中,|| 是逻辑运算符,用于判断两个文件是否都不存在。[[ 是更适合处理逻辑运算的工具。

    示例:

    if [[ ! -f file1 || ! -f file2 ]]; thenecho "至少有一个文件不存在"
    fi
    
  2. 无需引用避免问题

    • 使用 [[ 时,不需要给变量加引号来避免单词拆分或路径名扩展(globbing)。例如:
      file="my file with spaces"
      [[ -f $file ]]  # 不需要加引号,也不会报错
      
      如果使用单中括号([),就需要加引号:
      file="my file with spaces"
      [ -f "$file" ]  # 必须加引号,否则会报错
      
  3. 语法更直观

    • [[ 提供了更加直观的语法,用于区分字符串比较和数字比较。比如:
      num=5
      [[ $num -lt 10 ]]  # 数值比较
      [[ $str == "hello" ]]  # 字符串比较
      

    而在单中括号中,字符串比较需要额外注意语法的正确性。

  4. 防止意外的命令执行

    • 单中括号内部会解析命令,这可能导致一些不必要的副作用。而 [[ 则不会执行命令,而是只进行条件测试。

    示例:

    cmd="rm -rf /"
    [ $cmd ]  # 如果 cmd 未加引号,可能会误执行!
    

    使用双中括号则完全避免这个问题:

    [[ $cmd ]]  # 不会执行命令,只做字符串测试
    

为什么不是单中括号 [

单中括号 [ 是 POSIX 标准的一部分,适用于更基础的条件测试,例如文件存在性检查或简单的字符串比较。它在功能和安全性上稍弱于双中括号。

例如:

if [ ! -f $failed_tests_file ] || [ ! -f $all_tests_file ]; thenecho "至少有一个文件不存在"
fi

虽然功能相同,但由于需要明确分开两次测试,且变量需要引号,这种写法更容易出错。


总结

[[ 提供更安全、更灵活的条件测试语法,推荐在现代 Bash 脚本中优先使用。特别是在涉及逻辑运算符(如 ||&&)时,[[ 的语法显得更加简洁和可靠。

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

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

相关文章

Golang的GMP调度模型与源码解析

0、引言 我们知道,这当代操作系统中,多线程和多进程模型被广泛的使用以提高系统的并发效率。随着互联网不断的发展,面对如今的高并发场景,为每个任务都创建一个线程是不现实的,使用线程则需要系统不断的在用户态和内核态之间不断的切换,引起不必要的损耗,于是引入了协程…

有限状态机(FSM)的使用

有限状态机的使用 有限状态机在游戏制作中十分常见,它既可以作为玩家角色的控制框架,纯代码控制动画的播放,免去动画间的“连连看”;也可以制作简单的AI,甚至还可以搭配其它AI决策方式做出更复杂易用的AI控制……本文仅是个人对有限状态机的理解,与大家一同交流有限状态机…

【学习篇】patran设置阻尼

在数学和力学甚至机械专业中,质量-弹簧-阻尼系统是基础、经典的模型。其数学模型表示为: $$ m\ddot{x} +c\dot{x} +kx = 0 \qquad(1) $$ 有限元模型比较简单,就是两个质量点+弹簧假设上述式子的初值为 $$ \begin{cases} u(0)=0.2 \ \dot{u}(0)=0 \end{cases} $$ 各项系数为变…

mysql 查询每个订单总价和购买商品的总类数

数据表 CREATE TABLE goods ( order_id INT NOT NULL, goods_id INT NOT NULL, price DECIMAL(10, 2) NOT NULL ); 插入数据 INSERT INTO goods (order_id, goods_id, price) VALUES (1, 1, 3.5), (1, 2, 4.0), (2, 4, 6.0); 数据查询 SELECT order_id, SUM(price) AS total_pr…

【视频讲解】Python深度神经网络DNNs-K-Means(K-均值)聚类方法在MNIST等数据可视化对比分析

全文链接:https://tecdat.cn/?p=38289 原文出处:拓端数据部落公众号 分析师:Cucu Sun 近年来,由于诸如自动编码器等深度神经网络(DNN)的高表示能力,深度聚类方法发展迅速。其核心思想是表示学习和聚类可以相互促进:好的表示会带来好的聚类效果,而好的聚类为表示学习提…

时间

JDK7 时间 全世界的时间, 有一个统一的计算标准. 格林尼治时间/格林威治时间 (Greenwich Mean Time) 简称 GMT. 计算核心: 地球自转一天是 24 小时, 太阳直射时为正午 12 点. 后来发现计算误差较大, 现在格林威治时间已经不再作为标准时间来使用了. 到了 2012 年 1 月, 取消了用…

贴代码框架PasteForm特性介绍之markdown和richtext

简介 PasteForm是贴代码推出的 “新一代CRUD” ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代码生成器,你可以快速的为自己的项目构建后台管理端!目前管理端只有Html+js版本的,后续将支持小程序,Vue等 案例源码 案例源…

MATLAB用CNN-LSTM神经网络的语音情感分类深度学习研究

全文链接:https://tecdat.cn/?p=38258 原文出处:拓端数据部落公众号 在语音处理领域,对语音情感的分类是一个重要的研究方向。本文将介绍如何通过结合二维卷积神经网络(2 - D CNN)和长短期记忆网络(LSTM)构建一个用于语音分类任务的网络,特别是针对语音情感识别这一应…

2024长城靶场训练

仿射密码 首先题目描述 使用仿射函数y=3x+9加密得到的密文为JYYHWVPIDCOZ,请尝试对其解密。flag为flag{大写明文}。 1、使用在线网站直接破解或手工计算破解,获得flag。(参数a=3,b=9,对应仿射函数y=3x+9) 仿射密码加密_仿射密码解密手工计算使用解密函数为D(x) = a^-1(x …

学期2024-2025-1 学号20241421 《计算机基础与程序设计》第8周学习总结

作业信息 |这个作业属于哪个课程|https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP| |这个作业要求在哪里|https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08| |这个作业的目标|功能设计与面向对象设计,面向对象设计过程,面向对象语言三要素,汇编、编译、解释、…

QObject,QMainWindpw,QWidget,QDialog介绍

QObject QObject 的角色和特点 在 Qt 框架中,QObject 是整个对象模型的核心基类,它为 Qt 对象树 和 信号-槽机制 提供了基础支持。很多 Qt 的类(包括 QWidget、QDialog、QMainWindow)都直接或间接继承自 QObject。 QObject 的核心功能对象树管理(Object Tree)QObject 提供…