当前位置:网站首页>shell中计算命令详解(expr、(())、 $[]、let、bc )
shell中计算命令详解(expr、(())、 $[]、let、bc )
2022-08-02 08:02:00 【行走DI五花】
目录
一、expr命令
expr (evaluate expressions的缩写)。"表达式求值"。Shell expr是一个功能强大。并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等。
| 空格 | 隔开每个项 |
| \(反斜杠) | 放在 shell 特定的字符前面 |
| “”(引号) | 对包含空格和其他特殊字符的字符串要用引号括起来 |
1、整数运算(注意需要空格,需要加"\"不让特殊字符转义)

1、获取计算的结果赋值给新变量的语法
可以使用$()和 两个反撇好”``“ 表示。

2、字符串语法
1、计算字符串的长度语法
语法:expr length

2、截取字符串语法
语法:expr substr ”字符串“ start end
#start 截取字符串的起始位置,从1开始(注意编号从一开始,而不是0开始)
#end截取字符串的结束位置,包含这个位置也被截取

(start=1;end=2)
3、获取一个字符在字符串中第一次出现的位置
语法:expr index 被查找的字符串 需要查找的字符

4、正则表达式匹配1语法
语法: expr match 字符串 正则表达式
#正则表达式默认带有“^”,表示已什么开头
#返回值为符合,匹配字符长度,否则返回0
#正则表达式“."(点)代表任意一个字符
#正则表达式中通配符“*”(星号)代表前面的字符可以出现0次到多次
#“.*m”(点心m):匹配字符串中m前面的字符串长度(以任意长度字符开头到m结束且包含m,匹配m之前的长度。得出匹配字符串的长度)


5、正则表达式匹配2语法,功能和1一样,语法比1简单
语法:expr 字符串 :正则表达式
#正则表达式默认带有“^”,表示已什么开头
#返回值为符合,匹配字符长度,否则返回0

expr 小结:
1.整数计算:
expr 整数运算表达式
2字符串操作:
expr length 字符串 :获取字符串的长度
expr substr 字符串 start end : 截取字符串
expr index 字符串 查找的字符 :查找字符在字符串中第一次出现的位置,位置从1开始的
(expr match 字符串 正则表达式);(expr 字符串 : 正则表达式)
二、计算命令 :(()) 命令
1、作用
(())在运算表达式书写时,彼此之间有无空格都可以,遇到特殊字符时也不需要加“\”
能够使用(())进行整数的数学运算
2、介绍
双小括号(()),用于进行数学运算表达式的执行,将数学运算表达式放在((和))之间。可以使用$获取(())表达式命令的结果,这和使用$获得变量值是一样的。
3、语法
((整数运算表达式))
4、用法
① 给与双括号里面的变量赋值
((a=1+6)) 可以在计算完成后给变量赋值。
((b=a-1)) 把a-1的计算结果赋值给b,此中的变量a前面不需要加$,(())具有自动解析双括号内 的变量的功能。
②给与双括号外面的变量赋值
a=$((1+6))
b=$((a-1))
c=$((a+b))
解析:可以在(())前面加上S符号获取(())命令的执行结果,从而获取整个表达式的值。以c=$((a+b))为例,即将a+b这个表达式的运算结果赋值给变量c。注意,如果c=((a+b)这样的写法是错误的,不加$就不能取得表达式的结果。
③于逻辑预算符进行使用
((a>7 && b==c)) : (())也可以进行逻辑运算,在if语句中常会使用逻辑运算。
echo $((a+10)) : 需要立即输出表达式的运算结果时,可以在(())前面加$符号
((a=3+5,b=a+10)) : 对多个表达式同时进行计算时,多表表达式使用"∵"号隔开
需求:
1、计算1+6并赋值给变量a
2、计算变量a-1赋值给变量b
3、计算变量a+变量b赋值给变量c
4、打印变量a,变量b,变量c的值
5、$赋值写法
6、(())多个表达式计算赋值
7、 echo输出直接使用(())
8、 (())用于逻辑表达式在if中使用

(()) 用法 小结:
1、括号内赋值:((变量名=整数表达式))
2、括号外赋值:变量名=$((整数表达式))
3、多表达式赋值:((变量名1=整数表达式1,变量名2=整数表达式2...))
4、与if条件句配合使用: if((整数表达式))
三、let 命令详解
功能:能够使用let进行整数数学运算赋值
let命令和双小括号(()),在数学计算方面功能一样,但是没有(())的功能强大,let只能用于赋值计算,不能直接输出,不可以和if条件判断一起使用。
语法:let 赋值表达式
1、语法功能等价于((表达式)),let后面的整数运算表达式中变量不需要加$,特殊字符前也不需要加“\”
2、多个表达式之间使用空格 而不是","号
3、对于类似let a+b这样的写法,Shell虽然计算了a+b的值,但却将结果丢弃,如果echo let a+b 会直接输出字符串 a+b;若不想这样。可以使用1et summa+b将a+b的结果保存在变量sum中
示例:正常整数运算

变量++和++变量的区别

变量数值自增+2的表示方法

乘法表示方法

let 命令小结:
1、let数字整数计算用法
2、作用:用于赋值,是最简洁的整数运算赋值命令计算赋值用法: let变量名=整数运算表达式
3、多个表达式计算赋值用法: let 变量名1=整数运算表达式1 变量名2=整数运算表达式2 ...
四、$[] 命令
1、功能
能够使用$[ ]进行整数的数学运算
和(())、let命令类似,$[ ]也只能进行整数运算。但是只能对单个表达式的计算求值与输出,不能多个同属进行。
2、语法
格式:$[表达式]
①$[ ]会对表达式进行计算,并取得计算结果
②表达式内部不可以赋值给变量没有(())功能强大
3、用法

五、bc 命令
1、功能:
完成整数及小数运算
①能够在bc中进行互动式的数学运算
②能够在shell中进行非互动式的bc管道运算
③能够在shell中非互动式的输入重定向bc运算
Ⅰ:bc中的互动式的数学运算
2、语法
语法一(作为系统计算器使用)
格式:bc [选项] [参数]

还可以对文件内容进行计算

3、内置变量
scale :指定精度,对计算结果指定保留小数;默认为0,即不使用小数部分只保留整数位。


Ⅱ: bc在shell中进行非互动式的bc管道运算
1、语法
echo "表达式" | bc [选项]

2、将bc计算的结果赋值给shell变量
第一种方式:
A=$(echo "表达式" | bc [选项])
第二种方式:反引号
A=`echo "表达式" | bc [选项]`
两种方式区别:``反引号是所有linux系统支持的方式。兼容性较好,但是容易与引号产生混淆
$()不是所有linux系统都支持的方式。兼容性较差,但是不容易产生混淆

Ⅲ: bc在shell中进行非互动式的输入重定向运算
1、作用
将计算表达式输出给bc去执行,特点类似于文件中输入,可以输入多行表达式,更加清晰
2、语法
第一种方式:
A=`bc << EOF
第一行表达式
第二行表达式
第三行表达式
......................
EOF
` (反引号结束)
第二种方式:
A=$(bc << EOF
第一行表达式
第二行表达式
第三行表达式
......................
EOF
) 括号结束

总结:
let 赋值最方便
(()) 直接求值输出最方便,且支持多表达式同时运算
expr 优点:可以直接输出
缺点:计算表达式里面引用变量使用$,特殊字符需要转义只能计算一个表达式
(()) 优点:直接输出,里面直接使用变量名,特殊字符不需要转义,多个表达式赋值,可进行多表达式 同时i计算,使用”,“互相分开
缺点:需要获值以后才可以输出
let 优点:赋值简单,特殊字符不需要转义,可进行多表达式同时i计算,使用空格互相分开
缺点:不能直接输出
$[ ] 优点:特殊字符不需要转义
缺点: 不能进行多表达式同时计算
bc 可以计算整数和小数,在保留小数后几位,只有除法有效
边栏推荐
- 【特别提醒】订阅此专栏的用户请先阅读本文再决定是否需要购买此专栏
- etcd implements large-scale service governance application combat
- Redisson实现分布式锁
- HCIP9_BGP增加实验
- Redisson distributed lock source code analysis for high-level use of redis
- prometheus monitoring mysql_galera cluster
- Database triggers and transactions
- Ansible 学习总结(11)—— task 并行执行之 forks 与 serial 参数详解
- nodejs 简介
- WebGPU 导入[2] - 核心概念与重要机制解读
猜你喜欢
What is NoSQL?Databases for the cloud-scale future

设置工作模式与环境(中):建造二级引导器

Biotinyl Cystamine | CAS: 128915-82-2 | biotin cysteamine
![[ansible] playbook explains the execution steps in combination with the project](/img/fe/82b8562075fef33490d5aae7e809f5.png)
[ansible] playbook explains the execution steps in combination with the project

研发过程中的文档管理与工具

Biotin-EDA|CAS:111790-37-5| Ethylenediamine biotin

多版本node的安装与切换详细操作

Stop mental exhaustion Daily sharing

(Note)阿克西斯ACASIS DT-3608双盘位硬盘阵列盒RAID设置

Mysql Mac版下载安装教程
随机推荐
5分钟搞懂MySQL - 行转列
Database Plus 的云上之旅:SphereEx 正式开源 ShardingSphere on Cloud 解决方案
商业智能平台BI 商业智能分析平台 如何选择合适的商业智能平台BI
Biotin-LC-Hydrazide|CAS:109276-34-8|生物素-LC-酰肼
积分商城商品供应商选择的三个要求
【C】关于柔性数组.简要的谈谈柔性数组
设置工作模式与环境(中):建造二级引导器
sql创建表格 如图 运行完提示invalid table name 是什么原因
MySQL优化:从十几秒优化到三百毫秒
[ansible] playbook explains the execution steps in combination with the project
Application and case analysis of CASA model and CENTURY model
Mysql各个大版本之间的区别
基于PyTorch的flappy bird游戏
Three types of [OC learning notes] Block
MySQL压缩包方式安装,傻瓜式教学
52.【bool类型输入任何非0数值不为1的版本原因】
Write a small game in C (three chess)
按键控制流水灯(计时器)
Biotin hydrazide HCl|CAS:66640-86-6|Biotin-hydrazide hydrochloride
uniapp 禁止默认返回事件