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

上回梳理 了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.mfbz.cn/a/131063.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

试题:最大的矩形(给定直方图里面积最大的矩形)

问题描述 在横轴上放了n个相邻的矩形&#xff0c;每个矩形的宽度是1&#xff0c;而第i&#xff08;1 ≤ i ≤ n&#xff09;个矩形的高度是hi。这n个矩形构成了一个直方图。例如&#xff0c;下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。 请找出能放在给定直方图里面积最大的…

【华为OD:C++机试】Day-4

目录 &#x1f337;1. 排队游戏&#xff1a; &#x1f337;2. 购物&#xff1a; &#x1f337;3. 划分字符串&#xff1a; &#x1f337;4. MELON 的难题&#xff1a; &#x1f337;5. 荒岛求生&#xff1a; &#x1f337;6. 通过软盘拷贝文件&#xff1a; &#x1f337;7. 数字…

呼叫中心系统如果对接大模型

电话机器人对接大模型的例子 介绍 自chatgpt3.5发布以来&#xff0c;各种大模型飞速发展&#xff0c;各行各业都有接入大模型的需求&#xff0c;呼叫中心行业非常适合通过接入大模型用AI来回答用户的各种咨询&#xff0c;降低人力资源&#xff0c;使用顶顶通呼叫中心中间件&a…

使用JavaScript编写游戏平台数据爬虫程序

目录 一、引言 二、准备工作 三、爬取数据 四、数据处理与存储 五、数据分析与利用 六、结论与展望 一、引言 随着网络技术的发展&#xff0c;数据已经成为企业、研究机构和个人的重要资源。数据可以帮助我们了解市场趋势、用户需求&#xff0c;甚至可以用于机器学习和人…

【狂神说Java】linux详解

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

Java 之 IO/NIO/OKIO

BIO blocking io AIO Asynchronous IO 从内存读取到写入--输出 从外部到内存 -- 输入 OutputStream //文件不存在则自动创建 try {OutputStream outputStream new FileOutputStream("text.txt");outputStream.write(a);outputStream.write(b);} catch (IOExcep…

小程序开发——小程序页面的配置与生命周期

目录 1.小程序的页面配置 2.页面的生命周期 3.页面跳转 4.页面间的参数传递 5.新闻客户端案例讲解 6.小结 1.小程序的页面配置 页面的配置设置app.json中的window配置项的内容&#xff08;页面中配置项会覆盖app.json的window中相同的配置项&#xff09;&#xff0c;其属…

Milvus Cloud——LLM Agent 现阶段出现的问题

LLM Agent 现阶段出现的问题 由于一些 LLM&#xff08;GPT-4&#xff09;带来了惊人的自然语言理解和生成能力&#xff0c;并且能处理非常复杂的任务&#xff0c;一度让 LLM Agent 成为满足人们对科幻电影所有憧憬的最终答案。但是在实际使用过程中&#xff0c;大家逐渐发现了通…

计算机网络(一)

一、什么是计算机网络、计算机协议&#xff1f; 计算机网络就是由计算机作为收发端&#xff0c;不同计算机相互连接的网络&#xff0c;包括互联网&#xff08;Internet&#xff09;&#xff0c;公司或者家用网络&#xff08;intranet&#xff09;等等&#xff1b;其中Internet…

MobaXterm 安装+使用

目录 1 下载安装 1.1 官网下载(速度慢) 1.2 WebRA下载(不是最新版) 2 常用功能 2.1 基础设置 2.2 常用功能 1 下载安装 1.1 官网下载(速度慢) 点击MobaXterm官网,按下图↓↓步骤下载 1.2 WebRA下载(不是最新版) 点击WebRA网址,按下图↓↓步骤下载 2 常用功能 2.1 基础设…

【仿真动画】人机协作机器人自动化产线仿真动画欣赏

人机协作机器人自动化产线仿真动画 动画部分思维导图 机器人自动化产线仿真动画是利用三维动画技术对机器人自动化产线进行仿真模拟&#xff0c;以直观、形象的方式展示产线的运行情况。它具有以下作用&#xff1a; 提高沟通效率 机器人自动化产线的设计、实施和维护涉及多个部…

Java面试题

一、项目面试题-消息队列 背景&#xff1a;在分布式系统中是如何处理高并发的。 由于在高并发的环境下&#xff0c;来不及同步处理用户发送的请求&#xff0c;则会导致请求发生阻塞。比如说&#xff0c;大量的insert&#xff0c;update之类的请求同时到达数据库MYSQL&#xff…

C#源代码生成器深入讲解一

C#源代码生成器 01 源代码生成器初体验 新建一个类库&#xff0c;一定是standard2.0版本&#xff0c;否则会出问题。引用Nuget包Microsoft.CodeAnalysis.Common新建一个类&#xff0c;继承自ISourceGenerator接口 //一定要写&#xff0c;制定语言 [Generator(LanguageNames.…

python3GUI--PyQt5打包心得(二)nuitka、inno Setup(详细图文演示、附所有软件)

文章目录 一&#xff0e;前言二&#xff0e;准备1.nuitka1.1介绍1.3项目地址1.3安装 2.mingw641.1介绍1.2下载安装 3.Inno Setup1.1介绍1.2安装 三&#xff0e;nuitka打包1.打包2.装mingw643.装ccahe4.打包完成 四&#xff0e;测试效果五&#xff0e;inno Setup制作安装软件1.配…

微信小程序前端开发

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

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(三)

员工分页查询和账号启用禁用功能 1. 员工分页查询1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 设计DTO类1.2.2 封装PageResult1.2.3 Controller层1.2.4 Service层接口1.2.5 Service层实现类1.2.6 Mapper层 1.3 功能测试1.4 代码完善 2. 启用禁用员工账号…

FPGA与STM32_FSMC总线通信实验

FPGA与STM32_FSMC总线通信实验 内部存储器IP核的参数设置创建IP核FPGA代码STM32标准库的程序 STM32F407 上自带 FSMC 控制器&#xff0c;通过 FSMC 总线的地址复用模式实现STM32 与 FPGA 之间的通信&#xff0c;FPGA 内部建立 RAM 块&#xff0c;FPGA 桥接 STM32 和 RAM 块&…

Python喜羊羊

目录 系列文章 写在前面 绘图基础 画喜羊羊 写在后面 系列文章 序号文章目录直达链接表白系列1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want5…

Linux常用命令——bzmore命令

在线Linux命令查询工具 bzmore 查看bzip2压缩过的文本文件的内容 补充说明 bzmore命令用于查看bzip2压缩过的文本文件的内容&#xff0c;当下一屏显示不下时可以实现分屏显示。 语法 bzmore(参数)参数 文件&#xff1a;指定要分屏显示的.bz2压缩包。 在线Linux命令查询…

AD9371 Crossbar 和 I、Q数据 映射JESD204B传输层

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…