【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 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试 test常用于 if ,作为判断条件,if test等价于 if [ ],因此,test和[] 内的内…...
利用flask解析海康摄像头视频
利用flask解析海康摄像头视频利用flask解析海康摄像头和大华摄像头的视频一、安装依赖包二、获取海康摄像头视频流三、将视频流输出到Web页面四、 创建HTML模板文件利用flask解析海康摄像头和大华摄像头的视频 作为AI智能的一种应用场景,视频监控系统已经在各个行业…...
./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 时,执行该代码块 }if(true) {System.out.println("hello"); }if else if(条件表达式){// 表达式为 true 时,执行该代码块 } else {// 表达式为 false 时,执行该代码块 }if(1 …...
边界无限入选首届“网络安全高成长性企业”并荣获“勇创之星”
近日,由工业和信息化部、四川省人民政府主办的“2023年中国网络和数据安全产业高峰论坛网络安全产融合作分论坛”在成都举行,论坛上公布了“2022年度网络安全高成长性企业”名单。云原生安全、应用安全“灵动智御”理念创领者北京边界无限科技有限公司&a…...
SpringBoot项目的快速创建方式(包含第一个程序的运行)
目录 一、IDEA所用的版本以及插件 二、操作步骤 一、IDEA所用的版本以及插件 idea的版本: idea2022版本下载安装配置与卸载详细步骤(包含运行第一个java程序教程)_idea2022下载_云边的快乐猫的博客-CSDN博客 如果英文看不懂就点击…...
linux下设置定期执行需要root权限的sh文件
1、准备好一个shell文件 比如我这个叫clean.sh,位于/home/admin/gdhysthj/clean.sh 2、首先将shell文件赋权为可执行文件 chmod 777 clean.sh 3、切换为超级管理员 su 4、设置定时器 crontab -u root -e 5、回车后,进入一个类似vim的界面,…...
认识异或运算
1.什么是异或运算 异或运算是位运算的一种,符号为:^ 运算规则为:相同为0,不同为1 例如 性质: 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时遇到了一些问题,几经波折,终于解决了,故写下这篇博客,希望能帮到有相同问题的兄弟。 何时使用 当我们想要一个应用的数据向外部公开时,ContentProvider是一个不错…...
Modelsim 操作结构和流程
用到的命令一般都写到.do文件中,使用脚本语言进行批量处理。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上手难度低,不过react社区活跃度更多一些,一般数据比较多的大型项目会倾向于使用react。在react官网中,官方也建议我们使用React来构建快速响应的大型 Web 应用程序。vue2.0是面向对象编程({data: {}, methods: {}, created() …...
js求解《初级算法》28. 找出字符串中第一个匹配项的下标
一、题目描述 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 输入:haystack "sadb…...
VAE--part1
Variational Auto-Encoder, VAE__part1分布变换VAE慢谈VAE 初现分布标准化重参数技巧VAE的本质是什么?VAE的本质结构正态分布?变分在哪里参考博客仅做学习记录,侵删分布变换 VAE和GAN都是生成式模型,它们俩的目标基本一致&#x…...
备战四级!!!
目录 一、替换词 二、作文常见句型 (1)常见开头 (2)阐述观点 (3)结束语 (4)提出建议 (5)表示论证 (6)给出原因 (…...
sizeof与strlen练习
前言 本篇仅仅是为了更加了解sizeof操作符和strlen函数练习. 对于多条sizeof操作符和strlen函数出现,可能很容易造成头脑不清晰,做题时容易混乱. 目录前言一维数组字符数组情况1:情况2情况3二维数组练习之前请牢记下面这段话.这将是头脑清晰地关键. 提示: sizeof(数组名)&#…...
知识图谱的介绍
知识图谱的由来 谷歌在2012年提出了知识图谱的概念,当时目的在于优化搜索引擎的返回结构,为用户提供更精确的结果。 知识图谱的定义 为了理解知识图谱,我们首先要明白信息与知识的概念。首先,信息表示的是外部的客观事实&#…...
【Redis】Redis高级客户端Lettuce详解
文章目录前提Lettuce简介连接Redis定制的连接URI语法基本使用API同步API异步API反应式API发布和订阅事务和批量命令执行Lua脚本执行高可用和分片普通主从模式哨兵模式集群模式动态命令和自定义命令高阶特性配置客户端资源使用连接池几个常见的渐进式删除例子在SpringBoot中使用…...
Qt——自定义界面之QStyle
1. Qt控件结构简介 首先我们要来讲讲GUI控件结构,这里以QComboBox为例: 一个完整的控件由一种或多种GUI元素构成: Complex Control Element。Primitive Element。Control Element。 1.1 Complex Control Element Complex control elements …...
指针和数组面试题(逐题分析,完善你可能遗漏的知识)
人生不是一种享乐,而是一桩十分沉重的工作。 —— 列夫托尔斯泰 前言:之前我们就学习了数组和指针的知识。 数组:数组就是能够存放一组相同类型的元素,数组的大小取决于数组的元素个数和元素类型。 指针:…...
centos7搭建nfs挂载日志目录完整步骤
NFS服务器配置 1.安装NFS服务 首先使用yum安装nfs服务: yum -y install rpcbind nfs-utils 2.创建共享目录 在服务器上创建共享目录,并设置权限。 mkdir /data/share/ chmod 755 -R /data/share/ 3.配置NFS nfs的配置文件是 /etc/exports &…...
三、JavaScript
目录 一、JavaScript和html代码的结合方式 二、javascript和java的区别 1、变量 2、运算 3、数组(重点) 4、函数 5、重载 6、隐形参数arguments 7、js中的自定义对象 三、js中的事件 四、DOM模型 五、正则表达式 一、JavaScript和html代码的结合方…...
深圳大学计软《面向对象的程序设计》实验11 多继承
A. 在职研究生(多重继承) 题目描述 1、建立如下的类继承结构: 1)定义一个人员类CPeople,其属性(保护类型)有:姓名、性别、年龄; 2)从CPeople类派生出学生类CStudent,…...
并发变成实战-原子变量与非阻塞同步机制
文章目录1.锁的劣势2.硬件对并发的支持2.1 比较并交换2.2 非阻塞的计数器3.原子变量类3.1 原子变量是一种“更好的volatile”3.2 性能比较:锁与原子变量4.非阻塞算法4.1 非阻塞的栈4.2 非阻塞的链表4.3 ABA问题非阻塞算法设计和实现上要复杂的多,但在可伸…...
sql数据库常用操作指令
一、操作库-- 创建库create database db1;-- 创建库是否存在,不存在则创建create database if not exists db1;-- 查看所有数据库show databases;-- 查看某个数据库的定义信息 show create database db1; -- 修改数据库字符信息alter database db1 character set ut…...
4-1 定时任务的示例10个
文章目录前言基本命令与格式示例前言 Linux crontab 是用来定期执行程序的命令。当安装完成操作系统之后,默认都已经安装,并启动此任务调度命令。 crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。 基…...
外贸建站多少钱才能达到预期效果?
外贸建站多少钱才能达到预期效果?这是每个外贸企业都会问的问题。作为一个做外贸建站多年的人,我有一些个人的操盘感想。 首先,我认为外贸建站的投资是非常必要的。 因为在现代社会,网站已经成为外贸企业开展业务的必要工具之一…...
【Java学习笔记】5.Java 基本数据类型
Java 基本数据类型 变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。 因此,通过定义不同类型的变量…...
InnoDB 死锁和问题排查
文章目录死锁(dead lock)示例 1问题排查查看连接的线程查看相关的表查看最近一次的死锁信息查看服务器的锁信息查看正在使用的表如何尽可能地避免死锁死锁(dead lock) 两个及以上的事务各自持有对方需要的锁,导致双方…...
tensorflow07——使用tf.keras搭建神经网络(Sequential顺序神经网络)——六步法——鸢尾花数据集分类
使用tf.keras搭建顺序神经网络 六步法——鸢尾花数据集分类 01 导入相关包 02 导入数据集,打乱顺序 03 建立Sequential模型 04 编译——确定优化器,损失函数,评测指标(用哪一种准确率) 05 训练模型——把各项参入填入…...
关于Java连接Hive,Spark等服务的Kerberos工具类封装
关于Java连接Hive,Spark等服务的Kerberos工具类封装 idea连接服务器的hive等相关服务的kerberos认证注意事项 idea 本地配置,连接服务器;进行kerberos认证,连接hive、HDFS、Spark等服务注意事项: 本地idea连接Hadoo…...
建设网站 报告/如何查询百度收录情况
以下代码没有严格测试,能用,参数的地方有些错误,没有修正,自个看看代码中打开文件如果要用OpenFileDialog需要首先设置main的线程模式,缺点是弹出的对话框居然跑到后面去了,每什么意思。,我现在…...
哈尔滨网站设计人/免费使用seo软件
一、 认识回流和重绘 1.重绘:当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观、风格,而不会影响布局的,比如background-color。 2.回流::当render tree中的一部分(或全部)因为元素的规模尺寸、…...
做淘客网站需要企业的域名/百度关键词规划师入口
如今,电子书轻便海量的良好移动式体验受到广大年轻读者的喜爱。但是很多人也发现,有些电子书网站很贵,某些书籍还搜不到。今天,就给大家推荐6个电子书网站,不仅免费,而且品类丰富,能帮你找到99%…...
网站系统建设开票要开什么/电商平台怎么运营的
其实Runtime已经开源: 下载objc4-437.1.tar.gz来看看源码: 参考: http://blog.cocoabit.com/2014-10-06-yi-li-jie-objctive-c-runtime/转载于:https://www.cnblogs.com/A--G/p/5219485.html...
做网站新闻编辑/百度推广网站一年多少钱
大家好,基于Python的数据科学实践课程又到来了,大家尽情学习吧。本期内容主要由程茜与政委联合推出。函数1函数的基本使用函数还记得吗?中学的时候学过Yf(X),给定一个X,就有唯一的Y可以求出来。比如:y4x1&a…...
君临天下游戏网站开发者/长沙网站优化公司
一切都要从Python这门编程语言说起…… 去年教育部考试中心发布了“关于全国计算机等级(NCRE)体系调整”的通知,决定自2018年3月起,在计算机二级考试加入了“Python语言程序员设计”科目; 早些消息,浙江省…...