Linux shell编程学习笔记23:[] [[]]的用法小结

news2025/4/27 13:00:26

上回梳理 了Linux Shell编程中 () 、$()和 (())的用法,现在接着梳理 [] 和[[]]的用法。

1 单中括号(方括号)[]


1.1 检测某个条件是否成立


[和test等同,是 Shell 内置命令,用来检测某个条件是否成立。条件成立时退出状态为 0,否则为非 0 值。

1.1.1 字符串比较运算

1.1.1.1 ==(或=) 和  !=

Test和[]中,可用的比较运算符只有 ==(或=) 和  !=,两者都是用于字符串比较的,不可用于整数比较。

  • 在不引起歧义的情况下,[]中的变量名可以不加$前缀。

实例:

我们先定义字符串s1="abc"和s2="def"

然后在[]中分别使用==和!=来在bash和zsh进行测试。

1.在bash中

[csdn ~]$ s1="abc"; s2="def"
[csdn ~]$ echo $[ $s1 != $s2 ] 
0
[csdn ~]$ if [ $s1 != $s2 ] ; then echo s1=$s1; else echo s2=$s2; fi 
s1=abc
[csdn ~]$ echo $[ $s1 == $s2 ] 
1
[csdn ~]$ if [ $s1 == $s2 ] ; then echo s1=$s1; else echo s2=$s2; fi 
s2=def
[csdn ~]$ echo $[ s1 == s2 ] 
1
[csdn ~]$ 

2.在zsh中

csdn @ edu $ s1="abc"
csdn @ edu $ s1="abc";s2="def"
csdn @ edu $ echo $[ $s1 != $s2 ]
0
csdn @ edu $ if [ $s1 != $s2 ] ; then echo s1=$s1; else echo s2=$s2; fi 
else> 
csdn @ edu $ echo $[ $s1 == $s2 ]
1
csdn @ edu $ if [ $s1 == $s2 ] ; then echo s1=$s1; else echo s2=$s2; fi 
else>       
csdn @ edu $ echo $[ s1 == s2 ] 

csdn @ edu $ 

1.1.1.2 < 和 >

对字符串比较,是否直接可用使用大于号(>)和小于号(<)呢?

1.在bash中

[csdn ~]$ s1="abc"
[csdn ~]$ s2="def"
[csdn ~]$ echo $[ $s1 > $s2 ]
0
[csdn ~]$ [ $s1 \> $s2 ]
[csdn ~]$ echo $?
1
[csdn ~]$ echo $[ $s1 < $s2 ]
0
[csdn ~]$ [ $s1 \< $s2 ]
[csdn ~]$ echo $?
0
[csdn ~]$ 

在上面的例子中,我们先定义了字符串变量s1="abc"和 s2="def",然后在[]中直接使用  > 和 < 对s1和s2进行比较,显示结果都是1,明显有问题。

当我们在[]中使用 \> 和 \< 来对s1和s2进行比较,结果分别是1和0,这才是正确的结果。

 可见,在bash中,对于字符串比较,可以使用转义形式用大于号(>)和小于号(<)。

2.在zsh中

user # csdn zsh $ s1="abc"           
user # csdn zsh $ s2="def"           
user # csdn zsh $ echo $[ $s1 > $s2 ]
0
user # csdn zsh $ [ $s1 \> $s2 ]    
zsh: condition expected: >
user # csdn zsh $ echo $?
1
user # csdn zsh $ echo $[ $s1 < $s2 ]
0
user # csdn zsh $ [ $s1 \< $s2 ]     
zsh: condition expected: <
user # csdn zsh $ echo $?
1

在上面的例子中,我们同样先定义了字符串变量s1="abc"和 s2="def",然后在[]中直接使用  > 和 < 对s1和s2进行比较,显示结果都是0,与bash中不同,但同样明显有问题。

当我们在[]中使用 \> 和 \< 来对s1和s2进行比较,zsh不支持。

字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。

1.1.2 整数比较运算

1.1.2.1 -eq,-gt等

Test和[]中, 整数比较可以使用-eq,-gt这类形式。

1.1.2.1.1 在bash中

[csdn ~]$ i=1; let i++; echo i=$i; j=12;let j--;echo j=$j 
i=2
j=11
[csdn ~]$ [ $i -lt $j ]
[csdn ~]$ echo $?
0
[csdn ~]$ [ $i -gt $j ]
[csdn ~]$ echo $?
1

1.1.2.1.2 在zsh中

csdn @ edu $ i=1; let i++; echo i=$i; j=12;let j--;echo j=$j     
i=2
j=11
csdn @ edu $ [ $i -lt $j ]                                   
csdn @ edu $ echo $?
0
csdn @ edu $ [ $i -gt $j ]
csdn @ edu $ echo $?
1

 

 1.1.2.2 < 和 >

在大多编程变语言中,对Linux shell中的整数比较,是否直接可用使用大于号(>)和小于号(<)呢?

1.1.2.1.1在bash中

[csdn ~]$ i=1; let i++; echo i=$i; j=12;let j--;echo j=$j 
i=2
j=11 
[csdn ~]$ echo $[ i > j ]
0
[csdn ~]$ echo $[ i < j ]
1
[csdn ~]$ echo $[ i \< j ]
bash: i \< j : syntax error: invalid arithmetic operator (error token is "\< j ")
[csdn ~]$ [ i \< j ]
[csdn ~]$ echo $?
0
[csdn ~]$ [ i \> j ]
[csdn ~]$ echo $?
1

在上面的实例中,我们定义了整数变量i和j,

先直接使用 > 和 < 来比较i和j,结果分别是0和1,这个结果按字符串来比较是对的,但按整数来比较是错误的。

接着我们使用 \< 和 \> 来对i和j进行比较,结果分别是0和1,正确。

以下是按字符串来比较的结果。

[csdn ~]$ i='2'; j="11"
[csdn ~]$ echo $[ i > j ]
0
[csdn ~]$ echo $[ i < j ]
1

1.1.2.1.2 在zsh中

csdn @ edu $ i=1; let i++; echo i=$i; j=12;let j--;echo j=$j 
i=2
j=11
csdn @ edu $ echo $[ j > j ] 
0
csdn @ edu $ echo $[ j < j ] 
0
csdn @ edu $ echo $[ j \< j ] 
zsh: bad math expression: illegal character: \
csdn @ edu $ echo $[ j \> j ] 
zsh: bad math expression: illegal character: \

 

在上面的实例中,我们同样是定义了整数变量i和j,

先直接使用 > 和 < 来比较i和j,结果都是0,显示有问题。

接着我们使用 \< 和 \> 来对i和j进行比较,结果zsh不支持。 

1.1.3 逻辑运算

  • [ ]中的逻辑与 使用 -a  表示(and),和逻辑或使用  -o 表示(or)。
  • [ ]之间的逻辑与 使用 &&  表示(and),和逻辑或使用  || 表示(or)。

1.1.3.1 在bash中

[csdn ~]$ s1='a';s2='b';s3='a'
[csdn ~]$ [ $s1 == $s2 -o $s1 == $s3 ]
[csdn ~]$ echo $?
0
[csdn ~]$ [ $s1 == $s2 ] || [ $s1 == $s3 ]
[csdn ~]$ echo $?
0
[csdn ~]$  [ $s1 == $s2 -a $s1 == $s3 ]
[csdn ~]$ echo $?
1
[csdn ~]$ [ $s1 == $s2 ] && [ $s1 == $s3 ]
[csdn ~]$ echo $?
1

在上面的实例中,我们先定义了三个字符串变量: s1='a';s2='b';s3='a'

然后执行 [ $s1 == $s2 -o $s1 == $s3 ] , s1 == $s2 结果为1,$s1 == $s3结果为0,由于我们使用的是 -o (or ),所以结果为0

接着用命令  echo $? 来显示结果:0

然后的 [ $s1 == $s2 ] || [ $s1 == $s3 ] 和  [ $s1 == $s2 -o $s1 == $s3 ]是一样的。

接着执行 [ $s1 == $s2 -a $s1 == $s3 ] ,s1 == $s2 结果为1,$s1 == $s3结果为0,由于我们使用的是 -a (and ),所以结果为1

最后用命令  echo $? 来显示结果:0

1.1.3.2 在zsh中

csdn @ edu zsh $ s1='a';s2='b';s3='a'
csdn @ edu zsh $ [ $s1 == $s2 -o $s1 == $s3 ]
zsh: = not found
csdn @ edu zsh $ [ $s1 = $s2 -o $s1 = $s3 ] 
csdn @ edu zsh $ echo $?
0
csdn @ edu zsh $ [ $s1 == $s2 ] || [ $s1 == $s3 ]
zsh: = not found
csdn @ edu zsh $ [ $s1 = $s2 ] || [ $s1 = $s3 ] 
csdn @ edu zsh $ echo $?                         
0
csdn @ edu zsh $ [ $s1 = $s2 -o $s1 = $s3 ] 
csdn @ edu zsh $ echo $?                   
0
csdn @ edu zsh $ [ $s1 = $s2 ] && [ $s1 = $s3 ] 
csdn @ edu zsh $ echo $?                       
1

上面的实例与bash中是一样的,不过zsh不支持 == ,我们改为 = 。

1.2 引用数组中每个元素

对数组来说,中括号可以用来按下标索引访问数组元素。

1.2.1 在bash中

 [csdn ~]$ a=(1 2 3)
[csdn ~]$ echo ${a[1]}
2
[csdn ~]$ echo ${a[*]}
1 2 3

在上面实例中,我们先定义数组 a=(1 2 3)

然后用命令 echo ${a[1]} 显示数组中的第2个元素,bash中数组下标从0开始。

接着用命令 echo ${a[*]} 显示数组中的所有元素。

1.2.2 在zsh中

csdn @edu zsh $ a=(1 2 3)
csdn @edu zsh $ echo $a[1]
1
csdn @edu zsh $ echo $a[*]
1 2 3
csdn @edu zsh $ echo ${a[1]}
1
csdn @edu zsh $ echo ${a[*]}
1 2 3

在上面实例中,我们先定义数组 a=(1 2 3)

然后用命令 echo ${a[1]} 显示数组中的第1个元素,bash中数组下标从1开始。

接着用命令 echo ${a[*]} 显示数组中的所有元素。

2 双中括号(方括号)[[]]

[[ ]]是 Shell 内置关键字,它的功能和 [] 或 test 命令类似,也用来检测某个条件是否成立。

 [[ ]] 是 [] 或 test 的升级版,对细节进行了优化,并且扩展了一些功能。

  • [] 或 test 能做到的,[[ ]] 也能做到,而且 [[ ]] 做的更好;
  • [] 或 test 做不到的,[[ ]] 还能做到。

2.1 [[ ]] 支持字符串、整数比较运算 和 逻辑运算

2.1.1 在bash中

[csdn ~]$ s1='a';s2='b';s3='a'
[csdn ~]$ [ $s1 = $s2 || $s1 = $s3 ]
bash: [: missing `]'
bash: a: command not found
[csdn ~]$ [[ $s1 = $s2 || $s1 = $s3 ]]
[csdn ~]$ echo $?
0
[csdn ~]$ [[ $s1 = $s2 -o $s1 = $s3 ]]
bash: syntax error in conditional expression
bash: syntax error near `-o'
[csdn ~]$ [ $s1 = $s2 && $s1 = $s3 ]
bash: [: missing `]'
[csdn ~]$ [[ $s1 = $s2 && $s1 = $s3 ]]
[csdn ~]$ echo $?
1
[csdn ~]$ [[ $s1 = $s2 -a $s1 = $s3 ]]
bash: syntax error in conditional expression
bash: syntax error near `-a'

2.1.2 在zsh中

csdn @ edu zsh $ s1='a';s2='b';s3='a'        
csdn @ edu zsh $ [ $s1 = $s2 || $s1 = $s3 ]  
[: ']' expected
zsh: command not found: a
csdn @ edu zsh $ [[ $s1 = $s2 || $s1 = $s3 ]]
csdn @ edu zsh $ echo $?
0
csdn @ edu zsh $ [[ $s1 = $s2 -o $s1 = $s3 ]]
zsh: condition expected: $s1
csdn @ edu zsh $ [ $s1 = $s2 && $s1 = $s3 ] 
[: ']' expected
csdn @ edu zsh $ [[ $s1 = $s2 && $s1 = $s3 ]]
csdn @ edu zsh $ echo $?
1
csdn @ edu zsh $ [[ $s1 = $s2 -a $s1 = $s3 ]]
zsh: condition expected: $s1

在 [[ ]]  中支持使用 && 和 ||,不支持 -o 和 -a。 

2.2 支持正则表达式

在 Shell [[ ]] 中,可以使用=~来检测字符串是否符合某个正则表达式,其用法为:

[[ 字符串 =~ 正则表达式 ]]

例如:

  • ^[0-9]*$ 是检测是否为纯数字字符串的正则表达式
  • ^[a-z]*$ 是检测是否为纯小写字母字符串的正则表达式

 

2.2.1 在bash中

[csdn ~]$ s="12345"; [[ $s =~ ^[0-9]*$ ]]; echo $?
0
[csdn ~]$ s="12345abc"; [[ $s =~ ^[0-9]*$ ]]; echo $?
1
[csdn ~]$ s="12345"; [[ $s =~ ^[a-z]*$ ]]; echo $?
1
[csdn ~]$ s="abc"; [[ $s =~ ^[a-z]*$ ]]; echo $?
0

2.2.2 在zsh中

csdn @ edu zsh $ s="12345"; [[ $s =~ ^[0-9]*$ ]]; echo $?   
0
csdn @ edu zsh $ s="12345abc"; [[ $s =~ ^[0-9]*$ ]]; echo $?
1
csdn @ edu zsh $ s="12345"; [[ $s =~ ^[a-z]*$ ]]; echo $?
1
csdn @ edu zsh $ s="abc"; [[ $s =~ ^[a-z]*$ ]]; echo $?
0

 

2.2.3 注意

为了确保[[]]取得正确结果,其中的变量名要加上$前缀。

在bash中:

[csdn ~]$ s="12345"; [[ s =~ ^[0-9]*$ ]]; echo $?
1
[csdn ~]$ s="12345"; [[ $s =~ ^[0-9]*$ ]]; echo $?
0
[csdn ~]$ s="abc"; [[ s =~ ^[0-9]*$ ]]; echo $?
1
[csdn ~]$ s="abc"; [[ $s =~ ^[0-9]*$ ]]; echo $?
1
[csdn ~]$ s="abc"; [[ s =~ ^[a-z]*$ ]]; echo $?
0
[csdn ~]$ s="abc"; [[ $s =~ ^[a-z]*$ ]]; echo $?
0
[csdn ~]$ s="123"; [[ s =~ ^[a-z]*$ ]]; echo $?
0
[csdn ~]$ s="123"; [[ $s =~ ^[a-z]*$ ]]; echo $?
1

 

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

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

相关文章

vue实战——登出【详解】

登出逻辑 弹窗询问用户是否确定登出清除登录状态 登录状态通常存储在 vuex 和 sessionStorage 中&#xff0c;更彻底的登出还可以把所有本地存储数据都清除掉&#xff0c;如 Cookie 和 localStorage 。跳转到登录页面 代码实现 <div class"loginBox" v-if"is…

操作系统:输入输出管理(一)系统概述与设备独立性软件

一战成硕 5.1 I/O系统概述5.1.1 I/O设备5.1.2 I/O控制方式5.1.3 I/O软件层次结构5.1.4 应用程序的I/O接口 5.2 设备独立性软件5.2.1 与设备无关的软件5.2.2 高速缓存与缓冲区5.2.3 设备分配与回收5.2.4 spooling技术&#xff08;假脱机技术&#xff09; 5.1 I/O系统概述 5.1.1…

合并两个链表 --- 递归回溯算法练习二

目录 1. 分析题意 2. 分析算法原理 2.1. 递归思路&#xff1a; 1. 挖掘子问题&#xff1a; 3. 编写代码 3.1. step one 3.2. step two 3.3. step three 3.1. 递归写法 4. 补充 --- 迭代写法 5. 总结 1. 分析题意 力扣上原题链接如下&#xff1a; 21. 合并两个有序链表…

ubuntu16.04 交叉编译 mbedtls

在为客户交叉编译项目时需要依赖 mbedtls&#xff0c; 客户的机器是 arm64 的 ubuntu 16.04&#xff0c; 交叉编译过程中遇到几个问题。 首先&#xff0c; mbedtls 需要依赖 python, 在 cmake 的过程中&#xff0c; 如果不是使用系统默认的 cmake 可能会导致&#xff0c;mbedt…

6.4翻转二叉树(LC226—送分题,前序遍历)

算法&#xff1a; 第一想法是用昨天的层序遍历&#xff0c;把每一层level用切片反转。但是这样时间复杂度很高。 其实只要在遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。 这道题目使用前序遍历和后序遍历都可以&#xff0c;唯独中序遍历不方便&#x…

赛氪中西部外语翻译大赛入榜2023国内翻译赛事发展评估报告

中西部外语翻译大赛入选中国外文局CATTI项目管理中心和中国外文界平台联合发布《2023国内翻译赛事发展评估报告》 近日&#xff0c;中国外文局CATTI项目管理中心和中国外文界平台联合发布了《2023国内翻译赛事发展评估报告》&#xff0c;报告对国内主流外语翻译赛事进行了问卷调…

Centos8安装出错问题

科普介绍&#xff1a; CentOS 8 是一个基于 Linux 的操作系统&#xff0c;是 Red Hat Enterprise Linux &#xff08;RHEL&#xff09;的免费和开源版本。它提供了稳定、安全和可靠的基础设施&#xff0c;适用于服务器和桌面环境。CentOS 8 是 CentOS 系列中最新的版本&#x…

Nginx(五)

负载均衡 官网文档 Using nginx as HTTP load balancer nginx中实现反向代理的方式 HTTP&#xff1a;通过nginx配置反向代理到后端服务器&#xff0c;nginx将接收到的HTTP请求转发给后端服务器。使用 proxy_pass 命令 HTTPS&#xff1a;通过nginx配置反向代理到后端服务器&…

Amazon Aurora MySQL 与 Amazon Redshift 的 Zero ETL 集成已全面可用,一起轻松上手!

“数据是应用、流程和商业决策的核心。” 亚马逊云科技数据库、 数据分析和机器学习全球副总裁 Swami Sivasubramanian 如今&#xff0c;客户常用的数据传输模式是建立从 Amazon Aurora 到 Amazon Redshift 的数据管道。这些解决方案能够帮助客户获得新的见解&#xff0c;进而…

【狂神说Java】linux详解

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;狂神说Java &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…

Llama2通过llama.cpp模型量化 WindowsLinux本地部署

Llama2通过llama.cpp模型量化 Windows&Linux本地部署 什么是LLaMA 1 and 2 LLaMA&#xff0c;它是一组基础语言模型&#xff0c;参数范围从7B到65B。在数万亿的tokens上训练的模型&#xff0c;并表明可以专门使用公开可用的数据集来训练最先进的模型&#xff0c;而无需求…

编码规范集合

文章目录 前言命名规范项目命名目录命名文件命名命名严谨性 HTML 书写规范结构、样式、行为分离缩进文件编码语义化IE 兼容模式viewport为移动端设备优化&#xff0c;设置可见区域的宽度和初始缩放比例iOS 图标favicon&#xff08;网站图标&#xff0c;移动端默认可用于添加到桌…

微信小程序前端开发

目录 前言&#xff1a; 1. 框架选择和项目搭建 2. 小程序页面开发 3. 数据通信和接口调用 4. 性能优化和调试技巧 5. 小程序发布和上线 前言&#xff1a; 当谈到微信小程序前端开发时&#xff0c;我们指的是使用微信小程序框架进行开发的一种方式。在本文中&#xff0c;我…

100+ Windows运行命令大全,装B高手必备

操作电脑关闭、重启、注销、休眠的命令细则: 用法: shutdown [/i | /l | /s | /sg | /r | /g | /a | /p | /h | /e | /o] [/hybrid] [/soft] [/fw] [/f] [/m \\computer][/t xxx][/d [p|u:]xx:yy [/c "comment"]] 没有参数 显示帮助。这与键入 /? 是一样的。…

第七章 :Spring Boot web开发常用注解(二)

第七章 :Spring Boot web开发常用注解(二) 前言 本章节知识重点:作者结合自身开发经验,以及觉察到的一个现象:Springboot注解全面理解和掌握的并不多,对注解进行了全面总结,共分两个章节,可以作为web开发工程师注解参考手册,SpringBoot常用注解大全,一目了然!。本…

python机器学习——随机森林

随机森林 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;它通过构建多个决策树并结合它们的预测结果来进行分类或回归。 算法原理&#xff1a; 决策树&#xff08;Decision Tree&#xff09;: 随机森林由多个决策树组成。决策树是一种基于树…

增强地理热图:Highcharts Maps v11.2.0 Crack

Highcharts Maps v11.2.0 添加了对地理热图插值的支持&#xff0c;允许您在类似温度图的图表的已知数据点之间添加估计值。 Highcharts Maps 提供了一种符合标准的方法&#xff0c;用于在基于 Web 的项目中创建逻辑示意图。它扩展了用户友好的 Highcharts JavaScript API&#…

JTS: 18 DistanceToPoint 最近距离计算

这里写目录标题 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 import org.locationtech.jts.algorithm.distance.DistanceToPoint; import org.locationtech.jts.algorithm.distance.PointPairDistance; import org.locationtech.jts.geom.Coordin…

【Qt-23】ui界面设计-ToolBar

1、ToolBar 右击主窗体添加工具栏 新建动作&#xff0c;可设置图标&#xff0c;图标有本地文件和资源两种方式。 修改toolButtonStyle的属性&#xff0c;可设置图标与汉字显示的方式。 页面跳转&#xff1a; connect(ui->action, SIGNAL(triggered()), this, SLOT(openWid…

抖音直播矩阵玩法,直播矩阵引流项目,每日精准引流500左右

今天我再分享一个专注于纯直播带货的玩法&#xff0c;这个案例不论是导流还是直播模式&#xff0c;都值得我们深入关注。某音直播矩阵玩法&#xff0c;每日精准引流500 这种直播方式通常会邀请两位模特&#xff0c;一个展示产品&#xff0c;一个递交产品&#xff0c;无需过多的…