shell expr功能详解

expr命令可以实现数值运算、数值或字符串比较、字符串匹配、字符串提取、字符串长度计算等功能。它还具个特殊功能,判断变量或参数是否为整数、是否为空、是否为0等。

1.字符串表达式
-------------------------
'expr'支持模式匹配和字符串操作。字符串表达式的优先级高于数值表达式和逻辑关系表达式。'STRING : REGEX'执行模式匹配。两端参数会转换为字符格式,且第二个参数被视为正则表达式(GNU基本正则),它默认REGEX中隐含了"^",所以使得匹配时都是从string首字符开始的。随后将第一个参数和正则模式做匹配。 如果匹配成功,且REGEX使用了'\('和'\)',则此表达式返回匹配到的,如果未使用'\('和'\)',则返回匹配的字符数。 如果匹配失败,如果REGEX中使用了'\('和'\)',则此表达式返回空字符串,否则返回为0。 只有第一个'\(...\)'会引用返回的值;其余的'\(...\)'只在正则表达式分组时有意义。 在正则表达式中,'\+','\?'和'\|'分表代表匹配一个或多个,0个或1个以及两端任选其一的意思。]# expr "ab->cd" : ".*-"    #没有\(\),若正则匹配,只返回匹配的字符串长度3]# expr "ab->cd" : ".*->"   #没有\(\),若正则匹配,只返回匹配的字符串长度4]# expr "ab->cd" : ".\+"   #没有\(\),若正则匹配,只返回匹配的字符串长度6]# expr "ab->cd" : "\(.*\)->\(.*\)"  #有多个\(\),若正则匹配,只返回第一个\(\)内容ab]# expr  "ab->cd" : "\(a.\)"ab
'match STRING REGEX'等价于'STRING : REGEX'。]# expr match "ab->cd"  "\(.*b.*\)"ab->cd
'substr STRING POSITION LENGTH'返回STRING字符串中从POSITION开始,长度最大为LENGTH的子串。如果POSITION或LENGTH为负数,0或非数值,则返回空字符串。]# expr substr "ab->cd"  3 2->
'index STRING CHARSET'CHARSET中任意单个字符在STRING中最前面的字符位置。如果在STRING中完全不存在CHARSET中的字符,则返回0。见后文示例。]# expr index "ab->cd"  "-"3//该命令将对字符串"dec"逐字符分解,首先分解得到第一个字符d,从abcde中搜索到d的位置为4,再分解得到第二个字符e,该字符在abcde中的位置为5,最后得到的字符是c,该字符在abcde中的位置为3。其中3是最靠前的字符,所以命令返回的结果为3。]# expr index abcde dec3   ]# expr index abcde 1    //如果chars中的所有字符都不存在于string中,则返回0。0    
'length STRING'返回STRING的字符长度。其中string不允许为空,否则将报错]# expr length "ab->cd"6
'+ TOKEN'expr中有些符号和关键字有特殊意义,如"match"、"index"、"length",如果要让其成为字符,使用该表达式将任意token强制解析为普通字符串。]# expr + "substr" : "\(s.*\)"substr]# expr length + "substr"6要让expr将关键字解析为普通的字符,必须使用引号包围。2.算术表达式
-------------------------- 
'expr'支持普通的算术操作,算术表达式优先级低于字符串表达式,高于逻辑关系表达式。 
'+ -'加减运算。两端参数会转换为整数,如果转换失败则报错。]# expr 3 + 47]# expr 3 - 4-1
'* / %'乘,除,取模运算。两端参数会转换为整数,如果转换失败则报错。算术乘法符号"*"因为是shell的元字符,所以要转义,可以使用引号包围,或者使用反斜线]# expr 4 \* 312]# expr 4 / 31]# expr 4 % 313.逻辑关系表达式
--------------------------- 
'expr'支持普通的逻辑连接和逻辑关系。它的优先级最低。'|'|需要转义\|,或使用引号包围'|'正确的应该是:如果第一个参数非0,则返回第一个参数的值,否则返回第二个参数。但如果任意一个参数为空,则报错。除非空字符串使用引号包围,此时将和0的处理方式一样。]# expr 1 '|' 21]# expr 1 '|' 01]# expr 0 '|' 11# expr 0 '|' 00]# expr $ab '|' 1    #$ab为空expr: syntax error]# expr "$ab" '|' 1  #"$ab"为空字符串,相当于01
'&'    &需要转义\&,或使用引号包围'&'如果两个参数都非0,则返回第一个参数,否则返回0。但任意一个参数为空,则报错。除非空字符串使用引号包围,此时将和0的处理方式一样。]# expr 1 '&' 00]# expr 1 '&' 21]# expr 1 '&' 00]# expr 0 '&' 10]# expr $ab '&' 1  #$ab为空,报错expr: syntax error]# expr "$ab" '&' 1  #"$ab"为空字符,相当于00 
'< <= = == != >= >'比较两端的参数,如果为true,则返回1,否则返回0。"=="是"="的同义词。"expr"首先尝试将两端参数转换为整数,并做算术比较,如果转换失败,则按字符集排序规则做字符比较。比较操作符< <= = == != >= >用法示例。其中"<"和">"是正则表达式正的锚定元字符,且"<"会被shell解析为重定向符号,所以需要转义或用引号包围。这些操作符会首先会将两端的参数转换为数值,如果转换成功,则采用数值比较,如果转换失败,则按照字符集的排序规则进行字符大小比较。   括号'()'可以改变优先级,但使用时需要使用反斜线对括号进行转义。]# expr 4 '*' 4 - 10 '>=' 6  1]# expr 4 '*' \( 4 - 10 \) '>=' 6  04.'expr'使用示例
------------------------------- 
以下为expr的一些示例,其中有将shell的元字符使用引号包围的示例。 将shell中变量'foo'的值增加1: foo=$(expr $foo + 1)输出变量路径变量'$fname'中不包含'/'的文件名部分: expr "$fname" : '.*/\(.*\)' '|' "$fname"    解释:其中的'|'是expr中的连接符,只不过是被引号包围防止被shell解析。例如$fname=/etc/hosts,则此表达式返回hosts,如果$fname=/usr/share/,则此表达式'|'的左边为空,所以返回'|'右边的值,即$fname,即返回/usr/share/。An example showing that '\+' is an operator: expr aaa : 'a\+'    # 解释:因为REGEX部分没有使用\(\),所以返回匹配的字符数=> 3 expr abc : 'a\(.\)c'  # 解释:因为REGEX部分使用了\(\),所以返回匹配的字符=> bexpr index abcdef cz=> 3expr index index a    # 解释:因为第二个index是关键字error-> expr: syntax errorexpr index + index a  # 解释:使用+将index关键字解析为普通字符串=> 0

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

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

相关文章

AttributeError: ‘AlexNet‘ object has no attribute ‘module‘

当你尝试执行 model model.module 并收到错误消息 AttributeError: AlexNet object has no attribute module&#xff0c;这意味着你正在操作的模型对象&#xff08;在这个例子中是 AlexNet 类的一个实例&#xff09;并没有 module 这个属性。这个错误通常发生在以下几种情况&…

长度单位对比(英制和通用制)

0 Preface/Forewod 1 单位换算 1.1 英制单位 常见的英制长度单位如下&#xff1a; inch&#xff0c;英尺foot&#xff0c;英寸mile &#xff0c;英里 1.2 换算公式 1 inch 2.54 cm 1 yard 3 inch 1 foot 12 inch 12 * 2.54 cm 30.48 cm 1 foot 4 yard 1 mile …

Hutool工具简单用法

1、安装(POM) <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.16</version> </dependency> 2、使用 1、DateUtil //当前时间 Date date DateUtil.date(); //…

音乐管理系统

摘 要 现如今&#xff0c;在信息快速发展的时代&#xff0c;互联网已经成了人们在日常生活中进行信息交流的重要平台。看起来&#xff0c;听歌只是一种消遣和消遣&#xff0c;其实&#xff0c;只要你选对了曲子&#xff0c;就会产生许多不同的作用。音乐能舒缓身心&#xff0c…

你好,复变函数2.0

第一行&#xff1a;0 或 1 第二行&#xff1a;&#xff08;空格&#xff09;函数&#xff08;后缀&#xff09; #pragma warning(disable:4996) #include <easyx.h> #include <stdio.h> #include <math.h> #define PI 3.141592653589793 #define E 2.71828…

解决 执行 jar 命令 控制台乱码

Springboot项目&#xff0c;编码为utf8 打包后&#xff0c;为了在控制台运行时不乱码&#xff0c;需要在控制台中依次执行以下命令&#xff1a; 第一步&#xff1a; chcp 65001第二步&#xff1a; java -jar -Dfile.encodingutf-8 你的.jar

数字营销新玩法:拓新与裂变的完美结合

在当今这个飞速发展的数字化时代&#xff0c;数字营销已经成为了企业发展中至关重要的一环。拓新&#xff0c;简单来说就是不断去开拓新的客户群体&#xff0c;让更多的人了解并接触到我们的产品或服务。要做到这一点&#xff0c;那可得充分利用各种线上渠道。像热闹非凡的社交…

免费开源的地图解析工具【快速上手】

视频学习地址 这篇文章和【Nominatim】是相呼应的&#xff0c;在尝试了OSM数据一直有问题之后&#xff0c;通过别人的指点是不是可以换个思路&#xff0c;我的数据只需要精确到市级别&#xff0c;也可以不用OSM这样全的数据&#xff08;主要原因还是OSM太过庞大了&#xff09; …

软银CEO孙正义:10年内将出现比人类聪明1万倍的人工智能|TodayAI

2024年6月20日&#xff0c;软银集团公司&#xff08;SoftBank&#xff09;董事长兼首席执行官孙正义在日本东京举行的公司年度股东大会上发表讲话&#xff0c;表示比人类聪明1万倍的人工智能将在10年内出现。这是他近年来一次罕见的公开露面&#xff0c;在会上他质疑了自己的人…

连接和断开信号演示之二

代码; #include <gtk-2.0/gtk/gtk.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <glib-2.0/glib.h> #include <stdio.h>void button_press(GtkEventBox *ebox,GdkEventButton *event,GtkLabel *label) {const char *citem;switch(event->type…

开发常用依赖

目录 代理对象 Swagger Web 单元测试 MybatisPlus Lombok Mysql SpringBoot Jdk SpringCloud 数据库驱动包 hutool工具 配置仓库 通用库 maven插件 nacos注册中心 OpenFeign Spring AMQP JSON转换器 Redis 邮箱验证 Redisson分布式锁 客户端 代理对象 &l…

银河麒麟V10 SP1.1操作系统 离线安装 nginx1.21.5、redis 服务

银河麒麟官网地址&#xff1a;国产操作系统、麒麟操作系统——麒麟软件官方网站 一、查看系统版本 命令&#xff1a;nkvers 我的是 release V10 (SP1)&#xff0c;根据这个版本去官网找对应的rpm包 银河麒麟操作系统的rpm包必须从官方找&#xff0c; 要是随便找个Centos的rp…

SpringBoot集成OpenPDF导出pdf

1、引入依赖&#xff08;最后一个支持java8的版本&#xff09; <dependency><groupId>com.github.librepdf</groupId><artifactId>openpdf</artifactId><version>1.3.34</version> </dependency> <dependency><grou…

云安全下的等级保护2.0解决方案

云安全解决方案 知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 ​

【Linux系统】多线程

本篇博客继上一篇《线程与线程控制》&#xff0c;又整理了多线程相关的线程安全问题、互斥与锁、同步与条件变量、生产消费模型、线程池等内容&#xff0c;旨在让读者更加深刻地理解线程和初步掌握多线程编程。&#xff08;欲知线程的相关概念、线程控制的相关接口等&#xff0…

DbConnectionStringParser

import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class DbConnectionStringParser { public static String parserDbConnection(String connectionString) { // 检查是否为 SQL Server if (conne…

开发指南032-调整日志级别

1) 显示SQL语句及其参数 nacos里配置 spring: jpa: show-sql: true logback-spring.xml里配置 <logger name"org.hibernate.type.descriptor.sql.BasicBinder" level"TRACE"/> 2&#xff09;feign显示调用过程 logging: level: org.qlm.feign: …

总结之LangChain(三)——模型IO缓存

一、聊天模型缓存 LangChain为聊天模型提供了一个可选的缓存层。这有两个好处&#xff1a; 如果您经常多次请求相同的完成结果&#xff0c;它可以通过减少您对LLM提供程序的API调用次数来帮您节省费用。 它可以通过减少您对LLM提供程序的API调用次数来加快您的应用程序速度。…

Spring Boot + Apache Tika 实现文档内容解析

文章目录 1. 环境准备2. 创建 Spring Boot 项目2.1 初始化项目2.2 添加 Apache Tika 依赖 3. 创建文档解析服务3.1 创建服务类3.2 创建控制器类 4. 配置和运行4.1 配置 Apache Tika 数据文件4.2 运行应用程序 5. 测试和验证5.1 使用 Postman 或 cURL 进行测试 6. 注意事项和优化…

由 Vault 支持的 KES 的 MinIO Operator

为了提供安全锁定和擦除的合规性功能&#xff0c;MinIO 使用服务器端加密 &#xff08;SSE&#xff09; 在存储层加密对象&#xff0c;以保护对象作为写入操作的一部分。MinIO 以极高的效率做到这一点——基准测试表明 MinIO 能够以接近线速进行加密/解密。 MinIO 使用的秘诀是…