当前位置: 首页 > news >正文

【Linux】 shell if的[]和[[]]区别

文章目录

  • []和test
  • []和[[]]区别
  • 总结
  • 参考

[]和test

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试

test常用于 if ,作为判断条件,if test等价于 if [ ],因此,test和[] 内的内容完全可以直接互换!都支持

[]的语法可以参见 【Linux】shell中运算符(expr整数、字符串) 中的示例
test 语法参见 Shell test 命令

当然test也可以单独执行,如果当前目录存在hello.sh文件,则会获得返回值 0:

[root@linuxforliuhj test]# test -f hello.sh 
[root@linuxforliuhj test]# echo $?          
0

上面命令等价于下面语法:

[root@linuxforliuhj test]# [ -f hello.sh ]
[root@linuxforliuhj test]# echo $?          
0

因此 [] 就是一个内置命令,有返回值,而不是一个符号,[[]] 就是一个符号,不能单独存在,依赖 if

执行结果0 表示 true ,1 表示false

[]和[[]]区别

[] 或 [[]] 中,$a 表示变量a,如果没有$符号,默认为字符串,即 [[ a = b ]]等价于 [[ ‘a’ = ‘b’ ]]

  • 先有[] 语法,并内置于linux系统,后来才有 [[]] ,起初不是所有的都支持 [[]] ,当然后来基本上都支持了

  • [] 语法 都可以由 [[]] 替代,并且后者功能更丰富。二者大部分语法都相同,但是默认情况下 [] 识别的运算符比较少,需要使用转义字符等,下面会详解列出不同之处。

  • 二者都建议在表达式和括号自身使用空格 ,避免出错 if [[ $1 != "start" && $1 != "stop" ]],加空格一定不会报错,不加可能会报错

  • 当目标是数字类型时,二者都可以使用 -eq进行数字比较
    当使用-eq,并且类型被错误的赋值为非数字时,会提示错误,这样便于检查语法错误。

    示例:

    a=10
    b=20if [ $a -eq $b ]
    thenecho "$a -eq $b : a 等于 b"
    elseecho "$a -eq $b: a 不等于 b"
    fi
    
  • 当目标是数字类型时,都支持>、>=等 数字比较符,但是都 不建议使用,建议使用 -eq语法
    但是要注意的是 [] 需要增加转义字符,原因是[]默认 不识别特殊字符,而[[]] 天生支持

    a=10
    b=20
    if [ $a < $b ]         //单中括号执行报错,不识别 <thenecho "$a < $b : a < b"
    elseecho "$a > $b: a > b"
    fi	if [[ $a < $b ]]	 //双中括号执行成功
    thenecho "$a < $b : a < b"
    elseecho "$a > $b: a > b"
    fi	if [ $a \< $b ]    //转义字符执行成功
    thenecho "$a < $b : a < b"
    elseecho "$a > $b: a > b"
    fi	
  • 都可以使用= 、!=进行字符串比较
    需要注意的是,当字符串类型且有空格时,[]需要对字符串加引号,而[[]] 可加可不加

    #可以在终端命令行直接输入命令,分号是多条命令的分割符x='a b'; [ $x = 'a b' ]   //当字符串变量的值含有空格时,需要小心,执行会报错  [: too many arguments 错误,原因是把空格当做分割符了
    x='a b'; [ "$x" = 'a b' ]  //添加引号后,执行成功
    x='a b'; [[ $x = 'a b' ]]  //天生就可以执行成功
    

    当字符串类型且含有特殊字符,例如*号时,[]会报错,而[[]] 不会

    x='*'; [ $x = 'a b' ]  // bash: [: too many arguments
    x='*'; [[ $x = 'a b' ]]  // 执行成功
    
  • 在逻辑表达式语法稍有不同,[] 使用 -a、-o 分别表示与、或 关系 ,[[]]使用 &&、 ||表示与 、或关系

    单中括号示例:

    if [ $a -lt 100 -a $b -gt 15 ]
    thenecho "$a 小于 100 且 $b 大于 15 : 返回 true"
    elseecho "$a 小于 100 且 $b 大于 15 : 返回 false"
    fi
    

    双中括号示例:

    [[ a = a && b = b ]]
    

    单中括号不支持 &&语法,即使添加转义字符也不行,可以再外层使用 && :

     [ a = a && b = b ]    //错误[ a = a ] && [ b = b ]  //可以改造成这样,外部通过 &`在这里插入代码片`& 进行连接
    
  • 逻辑运算符的优先级
    优先级顺序 按照 : ()逻辑 > && > || ,并且单[] 不识别 小括号(),除非加转义字符

    unset a;unset b;  //清除a b 变量,防止影响执行结果[[ (a = a || a = b) && a = b ]];echo $? //注意是双中括号,最终结果为1  ,false ,先计算(a = a || a = b) 得到结果true ,然后再计算 true &&  a = b[[ a = a || a = b && a = b ]];echo $? // 注意是双中括号,最终结果为0  ,true,先计算右边  a = b && a = b,得到false,然后计算 a=a || false[ ( a = a ) ]  //报错,bash: syntax error near unexpected token 'a',即单括号不识别括号
    [ \( a = a -o a = b \) -a a = b ]   //没有语法错误
    
  • [[]]支持字符串模糊匹配,而[]不支持

    注意

    • 右侧不加引号时,支持通配符,左边是字符串,顺序不能颠倒 ;要想屏蔽通配符,需要加 转义字符;

    • 如果右侧是带引号的,此时就是普通字符串

    • * 可以使用星号代替零个、单个或多个字符;

    • ? 问号代替一个字符,必须有一个

    当是=号时,通配符表示是否以满足xxx条件

    [[ ab = a? ]]; echo $? //打印 0 true,因为 ?被当做通配符
    [[ a? = ab ]]; echo $?   //打印 1 false,颠倒了通配符因为失效了,在左侧就是普通字符串,等价于  [[ 'a?' = 'ab' ]]; echo $?
    [[ ab = a\? ]]; echo $? //打印	1	 false,因为加了转义字符,右侧通配符就是字符串了[[ ab =~ 'ab?' ]]; echo $? //打印 1 false ,因为加了引号,就是普通字符串
    

    当然通配符也可以用在前面:

    [[ ab = ?b ]];echo $?   //打印 0  true
    

    并且特别要注意的是,[] 中右侧的?匹配符号会被当做当前目录下的文件名称进行匹配,而不是字符串匹配了;
    *匹配符直接报错!前文得知,不管在左侧当做普通字符串,也报错
    因此建议禁用 通配符

    rm -f ab;touch ab;[ ab = a? ]; echo $?  # 打印 0 true  ,此时语法等价于 “是否当前目录存在ab这个文件,并且以a开头 ?”  比较别扭,也就是说 ab不再是字符串,而是当前目录的文件名称
    rm -f ab;[ ab = a? ]; echo $?  # 打印 1 falserm -f ab;touch ab;[ ab = a* ]; echo $?   # *号匹配符直接报错,
    
  • [[]]支持=~字符串模糊匹配,而[]不支持

    上一小节是用=进行判断,也可以用=~进行模糊判断,表示不满足条件,注意与!=进行区别:

    [[ ab =~ ab? ]]  ; echo $?   # 打印 0 true
    

    而[] 压根不支持=~,直接报错:

    [ a =~ a ] #  报错  bash: [: =~: binary operator expected

总结

尽量不用[],建议使用 [[]]

参考

linux shell if的[]和[[]]
[What is the difference between the Bash operators [[ vs vs ( vs ((?

相关文章:

【Linux】 shell if的[]和[[]]区别

文章目录[]和test[]和[[]]区别总结参考[]和test Shell中的 test 命令用于检查某个条件是否成立&#xff0c;它可以进行数值、字符和文件三个方面的测试 test常用于 if &#xff0c;作为判断条件&#xff0c;if test等价于 if [ ]&#xff0c;因此&#xff0c;test和[] 内的内…...

利用flask解析海康摄像头视频

利用flask解析海康摄像头视频利用flask解析海康摄像头和大华摄像头的视频一、安装依赖包二、获取海康摄像头视频流三、将视频流输出到Web页面四、 创建HTML模板文件利用flask解析海康摄像头和大华摄像头的视频 作为AI智能的一种应用场景&#xff0c;视频监控系统已经在各个行业…...

./docker-compose.yml‘ is invalid

文章目录前言提示原因版本太低解决方法更新删除原来不能执行的/usr/local/bin/docker-compose下载安装docker-compose添加权限前言 安装ctfd过程中的一些报错 rootubuntu:/CTFd# docker-compose up -d ERROR: The Compose file ./docker-compose.yml is invalid because: net…...

Java 流程控制

条件/选择结构 if if(条件表达式){// 表达式为 true 时&#xff0c;执行该代码块 }if(true) {System.out.println("hello"); }if else if(条件表达式){// 表达式为 true 时&#xff0c;执行该代码块 } else {// 表达式为 false 时&#xff0c;执行该代码块 }if(1 …...

边界无限入选首届“网络安全高成长性企业”并荣获“勇创之星”

近日&#xff0c;由工业和信息化部、四川省人民政府主办的“2023年中国网络和数据安全产业高峰论坛网络安全产融合作分论坛”在成都举行&#xff0c;论坛上公布了“2022年度网络安全高成长性企业”名单。云原生安全、应用安全“灵动智御”理念创领者北京边界无限科技有限公司&a…...

SpringBoot项目的快速创建方式(包含第一个程序的运行)

目录 一、IDEA所用的版本以及插件 二、操作步骤 一、IDEA所用的版本以及插件 idea的版本&#xff1a; idea2022版本下载安装配置与卸载详细步骤&#xff08;包含运行第一个java程序教程&#xff09;_idea2022下载_云边的快乐猫的博客-CSDN博客 如果英文看不懂就点击&#x1…...

linux下设置定期执行需要root权限的sh文件

1、准备好一个shell文件 比如我这个叫clean.sh&#xff0c;位于/home/admin/gdhysthj/clean.sh 2、首先将shell文件赋权为可执行文件 chmod 777 clean.sh 3、切换为超级管理员 su 4、设置定时器 crontab -u root -e 5、回车后&#xff0c;进入一个类似vim的界面&#xff0c…...

认识异或运算

1.什么是异或运算 异或运算是位运算的一种&#xff0c;符号为&#xff1a;^ 运算规则为&#xff1a;相同为0&#xff0c;不同为1 例如 性质&#xff1a; N ^ 0 N N ^ N 0 A ^ B B ^ A (A ^ B) ^ C A ^ (B ^ C)N ^ 0 N public class XorOperation {public static void …...

内容提供者的简单使用

内容提供者的简单使用 最近在复习ContentProvider时遇到了一些问题&#xff0c;几经波折&#xff0c;终于解决了&#xff0c;故写下这篇博客&#xff0c;希望能帮到有相同问题的兄弟。 何时使用 当我们想要一个应用的数据向外部公开时&#xff0c;ContentProvider是一个不错…...

Modelsim 操作结构和流程

用到的命令一般都写到.do文件中&#xff0c;使用脚本语言进行批量处理。Step 1: Map librariesStep 2: Compile the designStep 3: Optimize the design (OPTIONAL)Step 4: Load the design into the simulatorStep 5: Run the simulationStep 6: Debug the design Note: Desig…...

vue和react有什么不同

vue上手难度低&#xff0c;不过react社区活跃度更多一些&#xff0c;一般数据比较多的大型项目会倾向于使用react。在react官网中&#xff0c;官方也建议我们使用React来构建快速响应的大型 Web 应用程序。vue2.0是面向对象编程&#xff08;{data: {}, methods: {}, created() …...

js求解《初级算法》28. 找出字符串中第一个匹配项的下标

一、题目描述 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 输入&#xff1a;haystack "sadb…...

VAE--part1

Variational Auto-Encoder, VAE__part1分布变换VAE慢谈VAE 初现分布标准化重参数技巧VAE的本质是什么&#xff1f;VAE的本质结构正态分布&#xff1f;变分在哪里参考博客仅做学习记录&#xff0c;侵删分布变换 VAE和GAN都是生成式模型&#xff0c;它们俩的目标基本一致&#x…...

备战四级!!!

目录 一、替换词 二、作文常见句型 &#xff08;1&#xff09;常见开头 &#xff08;2&#xff09;阐述观点 &#xff08;3&#xff09;结束语 &#xff08;4&#xff09;提出建议 &#xff08;5&#xff09;表示论证 &#xff08;6&#xff09;给出原因 &#xff08;…...

sizeof与strlen练习

前言 本篇仅仅是为了更加了解sizeof操作符和strlen函数练习. 对于多条sizeof操作符和strlen函数出现,可能很容易造成头脑不清晰,做题时容易混乱. 目录前言一维数组字符数组情况1:情况2情况3二维数组练习之前请牢记下面这段话.这将是头脑清晰地关键. 提示: sizeof(数组名)&#…...

知识图谱的介绍

知识图谱的由来 谷歌在2012年提出了知识图谱的概念&#xff0c;当时目的在于优化搜索引擎的返回结构&#xff0c;为用户提供更精确的结果。 知识图谱的定义 为了理解知识图谱&#xff0c;我们首先要明白信息与知识的概念。首先&#xff0c;信息表示的是外部的客观事实&#…...

【Redis】Redis高级客户端Lettuce详解

文章目录前提Lettuce简介连接Redis定制的连接URI语法基本使用API同步API异步API反应式API发布和订阅事务和批量命令执行Lua脚本执行高可用和分片普通主从模式哨兵模式集群模式动态命令和自定义命令高阶特性配置客户端资源使用连接池几个常见的渐进式删除例子在SpringBoot中使用…...

Qt——自定义界面之QStyle

1. Qt控件结构简介 首先我们要来讲讲GUI控件结构&#xff0c;这里以QComboBox为例&#xff1a; 一个完整的控件由一种或多种GUI元素构成&#xff1a; Complex Control Element。Primitive Element。Control Element。 1.1 Complex Control Element Complex control elements …...

指针和数组面试题(逐题分析,完善你可能遗漏的知识)

人生不是一种享乐&#xff0c;而是一桩十分沉重的工作。 —— 列夫托尔斯泰 前言&#xff1a;之前我们就学习了数组和指针的知识。 数组&#xff1a;数组就是能够存放一组相同类型的元素&#xff0c;数组的大小取决于数组的元素个数和元素类型。 指针&#xff1a;…...

centos7搭建nfs挂载日志目录完整步骤

NFS服务器配置 1.安装NFS服务 首先使用yum安装nfs服务&#xff1a; yum -y install rpcbind nfs-utils 2.创建共享目录 在服务器上创建共享目录&#xff0c;并设置权限。 mkdir /data/share/ chmod 755 -R /data/share/ 3.配置NFS nfs的配置文件是 /etc/exports &…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...