Linux shell编程学习笔记9:字符串运算 和 if语句
Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、字符串、文件测试等多种运算,同样也需要进行根据条件进行流程控制,提供了if、for、while、until等语句。
上期学习笔记中我们研究了字符串数据的使用,今天我们研究字符串运算,为了应用实例进行讲解,我们同时研究了进行判断的时候经常使用的if语句。
一、常用字符串运算符
运算符 | 说明 |
---|---|
= | 检测两个字符串是否相等,相等返回 0(true),否则返回1(false)。 |
!= | 检测两个字符串是否不相等,不相等返回 0(true),否则返回1(false)。 |
-z | 检测字符串长度是否为0,为0返回 0(true),否则返回1(false)。 |
-n | 检测字符串长度是否不为 0,不为 0 返回 0(true),否则返回1(false)。 |
$ | 检测字符串是否不为空,不为空返回0(true),否则返回1(false)。 |
二、if语句
与C、C++、Pascal等其它编程语言相似,在 Linux Shell 编程中,同样需要进行根据条件进行流程控制,也提供了if、for、while、until等语句。
因为我们在下面进行字符串运算的实例讲解时需要使用流程控制来演示,所以今天我们先看看在进行判断的时候经常使用的if语句。
Linux Shell 脚本编程中 使用的 if 语句形式 与C、C++、Pascal等语言中还是较大差别的。
Linux Shell 脚本编程中 if 语句主要有以下几种形式和组合。
(一) if - then -fi 语句
if [condition]
then符合 condition 的执行语句
fi
(二) if -then-else-fi 语句
if [condition]
then符合 condition 的执行语句
else不符合 condition 的执行语句
fi
写起来是不是感觉有点麻烦?
所以Linux Shell 脚本编程中还提供了两种简写格式
(三) if ;- then -fi 语句
也就是将 then 与 if 写在同一行,这时]后面需要添加分号,例如:
if [condition]; then符合 condition 的执行语句
fi
(四)if -then-elif-then-fi 语句
将 else if 简写为 elif,elif 后面也要有 then来配对,如下所示:
if [condition1]
then符合 condition1 的执行语句
elif [condition2]
then符合 condition2 的执行语句
else 不符合 condition1 和 condition2 的执行语句
fi
或者
if [condition1]
then符合 condition1 的执行语句
elif [condition2]; then符合 condition2 的执行语句
else 不符合 condition1 和 condition2 的执行语句
fi
请注意两点:
1.结尾是将 if 倒过来写 fi 作为结束标志,而不是endif。
2.condition(条件表达式)要放在方括号之间,并且运算符和运算对象之间要有空格分隔。
例如, [$a=$b] 这种写法是错误的,因为$a=$b是赋值语句,
要进行比较必须写成 [ $a = $b ]。
网上有些教程说: 条件表达式要放在方括号之间,并且要有空格间隔,即 [$s1] 要写为 [ $s1 ]。
但在下面第三部分的实例中,我们写为 [ $s1] ,仍能执行并获得正确的结果。。
三、字符串操作实例
(一)字符串是否相等
user @host: ~ $s1='ab'
user @host: ~ $s2='cd'
user @host: ~ $s3='ab'
user @host: ~ $r=`expr $s1 = $s2`
user @host: ~ $echo $r
0
user @host: ~ $r=`expr $s1 = $s3`
user @host: ~ $echo $r
1
user @host: ~ $
注意:上面的命令中使用的反引号,不是单引号
从上例中,我们可以看到:
由于变量s1和s2不相等,所以$s1 = $s2 的比较结果是0。
由于变量s1和s3相等,所以$s1 = $s3 的 比较结果是1。
(二)字符串是否不相等
user @host: ~ $s1='ab'
user @host: ~ $s2='cd'
user @host: ~ $s3='ab'user @host: ~ $r=`expr $s1 != $s2`
user @host: ~ $echo $r
1
user @host: ~ $r=`expr $s1 != $s3`
user @host: ~ $echo $r
0
user @host: ~ $
注意:上面的命令中使用的反引号,不是单引号
从这个实例中,我们可以看到:
由于变量s1和s2不相等,所以$s1 != $s2 的比较结果是1。
由于变量s1和s3相等,所以$s1 != $s3 的比较结果是0。
字符串是否不相等 实例的比较结果跟前面字符串是否相等 的实例中正好相反。
(三)检测字符串长度是否为0
user @ host: ~ $ s1="ab"
user @ host: ~ $ if [ -z $s1 ]; then
> echo "-z $s1 ==0"
> else
> echo "-z $s1 !=0"
> fi
-z ab !=0
user @ host: ~ $ s1=""
user @ host: ~ $ if [ -z $s1 ]; then
> echo "-z $s1 == 0"
> else
> echo "-z $s1 != 0"
> fi
-z == 0
user @ host: ~ $
由于我们还没有研究到脚本文件,在上面的实例中,我们是通过命令行输入了两个命令序列,
第一个命令序列是
s1="ab"
if [ -z $s1 ]; thenecho "-z $s1 ==0"
elseecho "-z $s1 !=0"
fi
由于s1="ab",它的长度是2,所以执行结果为:
-z ab !=0
第二个命令序列是
s1=""
if [ -z $s1 ]; thenecho "-z $s1 ==0"
elseecho "-z $s1 !=0"
fi
由于s1="",它的长度是0,所以执行结果为:
-z == 0
(四)检测字符串长度是否不为0
把上面两段命令序列中的 -z $s1 改为 -n $s1,那么执行的结果就是下面这样的:
user @ host: ~ $ s1="ab"
user @ host: ~ $ if [ -n $s1 ]
> then
> echo "-n $s1 == 0"
> else
> echo "-n $s1 != 0"
> fi
-n ab == 0
user @ host: ~ $ s1=""
user @ host: ~ $ if [ -n $s1 ]
> then
> echo "-n $s1 == 0"
> else
> echo "-n $s1 != 0"
> fi
-n == 0
user @ host: ~ $
(五)检测字符串是否不为空
user @ host: ~ $ s1="ab"
user @ host: ~ $ if [ $s1 ]; then
> echo "$s1 != null"
> else
> echo "$s1 == null"
> fi
ab != null
user @ host: ~ $ s1=""
user @ host: ~ $ if [ $s1]
> then
> echo "$s1 != null"
> else
> echo "$s1 == null"
> fi
== null
user @ host: ~ $
在上面的实例中,我们是通过命令行输入了两个命令序列,
第一个命令序列是
s1="ab"
if [ $s1 ]; thenecho "$s1 != null"
elseecho "$s1 == null"
fi
由于s1="ab",其值不为空,所以执行结果为:
ab != null
第二个命令序列是
s1=""
if [ $s1]
thenecho "$s1 != null"
elseecho "$s1 == null"
fi
由于s1="",其值为空,所以执行结果为:
== null
第二个命令序列中的 if语句我们写成了 if [ $s1],仍能执行并获得正确的结果。
相关文章:

Linux shell编程学习笔记9:字符串运算 和 if语句
Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、字符串、文件测试等多种运算,同样也需要进行根据条件进行流程控制,提供了if、for、while、until等语句。 上期学习笔记中我们研究了字符串数据的使用,今天我们研…...
【分享】xpath的属性表达式
在XPath中,要选择HTML文档中具有特定类的元素,您通常需要使用属性选择器 [attribute-nameattribute-value] 来选择元素,其中 attribute-name 是属性名称,attribute-value 是要匹配的属性值。对于HTML元素的类选择器,您…...
Oracle Dataguard跨版本数据迁移(11.2.0.4~19.13.0.0)
一、前期准备 按照DG部署步骤修改DG参数、添加standby redo log、配置静态监听、配置tnsnames文件、备端修改参数文件、创建所需目录等配置好部署环境,这里不再赘述,跟正常部署DG无区别。 环境配置好后,进行后面的操作。 二、使用RMAN备份复…...

零基础Linux_14(基础IO_文件)缓冲区+文件系统inode等
目录 1. 缓冲区 1.1 缓冲区的存在 1.2 缓冲区的刷新策略 1.3 模拟C标准库中的文件操作 完整代码及验证: 1.4 重看缓冲区 1.5 stdout和stderr的区别 2. 文件系统 2.1 磁盘的物理结构CHS等 2.2 磁盘的抽象结构LBA等 2.3 文件管理inode等 2.4 对文件的操作…...

Vue中的router路由的介绍(快速入门)
路由的介绍 文章目录 路由的介绍1、VueRouter的介绍2、VueRouter的使用(52)2.1、5个基础步骤(固定)2.2、两个核心步骤 3、组件存放的目录(组件分类) 生活中的路由:设备和ip的映射关系(路由器) V…...

ESP-07S进行TCP 通信测试
一,TCP Server 为 AP 模式,TCP Client 为 Station 模式。 这里电脑pc作为TCP Server,ESP-07S作为TCP Client 。 二,电脑端配置。 1,开启热点。 2,转到“设置”,编辑热点信息。 3,关闭…...

如何找到新媒体矩阵中存在的问题?
随着数字媒体的发展,企业的新媒体矩阵已成为品牌推广和营销的重要手段之一。 然而,很多企业在搭建新媒体矩阵的过程中,往往会忽略一些问题,导致矩阵发展存在潜在风险,影响整个矩阵运营效果。 因此,找到目前…...
MongoDB-基本常用命令
基本常用命令 MongoDB常用命令a) 案例需求b) 数据库操作b.1) 选择和创建数据库b.2) 删除数据库 c) 集合操作c.1) 集合的显示创建c.2) 集合的隐式创建c.3) 集合的删除 d) 文档基本CRUDd.1) 文档的插入(1) 单个文档的插入(2) 批量插入 d.2) 文档的基本查询(1) 查询所有(2) 投影查…...
Linux 常用systemctl service 脚本
文章目录 1. jar 包部署 service 脚本2. nginx 服务安装 脚本3.artemis 服务安装脚本 1. jar 包部署 service 脚本 默认jdk 执行: [Service] Typesimple Userroot WorkingDirectory/opt/app/webserver ExecStart/usr/bin/java -Xms512m -Xss256k -jar /opt/app/we…...
flask-sqlalchemy实现读写分离完整版
1. 依赖版本: alembic==1.6.5 click==8.0.1 colorama==0.4.4 Flask==1.1.2 Flask-Migrate==2.7.0 Flask-Script==2.0.6 Flask-SQLAlchemy==2.4.4 greenlet==1.1.0 itsdangerous==2.0.1 Jinja2==3.0.1 Mako==1.1.4 MarkupSafe==2.0.1 protobuf==3.17.3 PyMySQL==1.0.2 python-…...

windows下在cmd和git bash中执行bash download.sh失败
cmd报错信息: 解决办法: win64-wget-1.21.4 安装软件wget,如下这是64位的包,解压后,下面有个wget.exe,拷贝到C:\Windows\System32、 然后打开cmd,执行wget -V 如上,有版本信息就O…...
rust流程控制
一、分支 (一)if 1.if 语法格式 if boolean_expression { }例子 fn main(){let num:i32 5;if num > 0 {println!("正数");} }条件表达式不需要用小括号。 条件表达式必须是bool类型。 2.if else 语法格式 if boolean_expression { } …...

虚拟机软件Parallels Desktop 19 mac功能介绍
Parallels Desktop 19 mac是一款虚拟机软件,它允许用户在Mac电脑上同时运行Windows、Linux和其他操作系统。Parallels Desktop提供了直观易用的界面,使用户可以轻松创建、配置和管理虚拟机。 PD19虚拟机软件具有快速启动和关闭虚拟机的能力,让…...

在工业机器视觉领域中应用钡铼技术有限公司的EtherCAT网关
钡铼技术有限公司作为一家专注于业物联网关、工业智能网关、边缘计算网关、ARM嵌入式工业计算机、PLC远程采集网关、Modbus转MQTT网关、OPC UA网关、BACnet网关路由器、Lora网关、工业4G边缘路由器、4G无线远程数据采集模块、4G DTU RTU、以太网远程IO模块、工业总线分布式I/O模…...
ssh指定的密钥协商方式以及Ansible的hosts文件修改密钥协商方式
一、首先你要知道用什么加密协商。 [WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details 10.10.2.190 | UNREACHABLE! > {"changed": false,"msg": "Failed to connect to the host via ssh: U…...

NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
自然语言处理是机器学习和人工智能的一个迷人领域。这篇博客文章启动了一个具体的 NLP 项目,涉及使用维基百科文章进行聚类、分类和知识提取。灵感和一般方法源自《Applied Text Analysis with Python》一书。 一、说明 该文是系列文章,揭示如何对爬取文…...
QT sqlite的简单用法
1、相关头文件 #include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery> #include <QSqlRecord> #include <QSqlIndex> #include <QSqlField> #include <QFile> #include <QDebug> 2、数据库对象 QSqlDatabas…...

大模型部署手记(12)LLaMa2+Chinese-LLaMA-Plus-2-7B+Windows+text-gen+中文对话
1.简介: 组织机构:Meta(Facebook) 代码仓:https://github.com/facebookresearch/llama 模型:chinese-alpaca-2-7b-hf 下载:使用百度网盘下载 硬件环境:暗影精灵7Plus Windows版…...
C#导出本机Win32native dll
C# 使用 "3f/DllExport" 工具导出C风格的本机函数 [文 / 张赐荣] 首先,让我们来了解一下什么是争渡读屏软件,以及什么是争渡文本预处理API。争渡读屏软件是一款屏幕朗读软件,用于协助视力障碍人士操作电脑。 争渡文本预处理API是一…...

express-generator快速构建node后端项目
express-generator是express官方团队开发者准备的一个快速生成工具,可以非常快速的生成一个基于express开发的框架基础应用。 npm安装 npm install express-generator -g初始化应用 express my_node_test 创建了一个名为 my_node_test 的express骨架项目通过 Exp…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...