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…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
