Bash技巧:介绍算术扩展进行算术运算和比较判断的用法
nanshan 2024-11-10 10:14 24 浏览 0 评论
在 Linux bash shell 中,算术扩展(arithmetic expansion)可以获取算术表达式的运算结果。
还可以进行加减乘除运算、比较大小、比较是否相等、进行与或非运算,等等。
查看 man bash 的说明如下:
Arithmetic expansion allows the evaluation of an arithmetic expression and the substitution of the result. The format for arithmetic expansion is:
$((expression))
The old format $[expression] is deprecated and will be removed in upcoming versions of bash.
The expression is treated as if it were within double quotes, but a double quote inside the parentheses is not treated specially. All tokens in the expression undergo parameter and variable expansion, command substitution, and quote removal.
The result is treated as the arithmetic expression to be evaluated. Arithmetic expansions may be nested.
The evaluation is performed according to the rules listed below under ARITHMETIC EVALUATION. If expression is invalid, bash prints a message indicating failure and no substitution occurs.
即,$((expression)) 算术扩展会按照 ARITHMETIC EVALUATION 描述的规则来评估 expression 算术表达式,并获取到该表达式的值。
算术表达式里面默认进行变量扩展、命令替换、移除引号。
由于默认进行变量扩展,可以直接用变量名来获取变量值,不需要在变量名前面加 $ 符号。
如果只是要评估算术表达式,不需要获取算术表达式的值,写为 ((expression)) 即可。
查看 man bash 对 ((expression)) 复合命令的说明如下:
((expression))
The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION.
If the value of the expression is non-zero, the return status is 0; otherwise the return status is 1.
This is exactly equivalent to let "expression".
即,写为 ((expression)) 这个形式,也会按照 ARITHMETIC EVALUATION 描述的规则来评估 expression 算术表达式,只是获取不到该表达式的值。
它等价于 let "expression" 语句。
具体的 ARITHMETIC EVALUATION 规则可以查看 man bash 的说明,里面的关键点如下:
The operators and their precedence, associativity, and values are the same as in the C language.
即,在 ((expression)) 表达式中,所使用的运算符、运算符优先级、运算符结合规则跟 C 语言一致。
对于熟悉 C 语言的人来说,方便使用。
具体举例说明如下:
$ number=1
$ number+=5
$ echo $number
15
$ number=$((number + 3))
$ echo $number
18
$ ((number += 3))
$ echo $number
21
可以看到,先将 number 赋值为 1,然后执行 number+=5 语句。
但是打印 number 变量值,结果是 15,而不是 6。
即,直接写为 number+=5 的形式,是字符串拼接,而不是进行算术运算。
number=$((number + 3)) 命令使用算术扩展,会获取到 number 变量值加上 3 之后的值,并赋值给 number 变量值,是 18。
这个表达式进行了算术运算。
((number += 3)) 命令没有使用算术扩展,只是处理算术表达式。
通过算术表达式的 += 赋值操作符,把 number 变量值加上 3,并赋值给 number 变量。
这个写法跟 number=$((number + 3)) 命令的效果相同。
在算术表达式内,直接通过 number 变量名就可以获取变量值,不需要写为 $number 的形式。
总的来说,在 bash 中,要进行算术表达式运算,需要使用特定的写法、或者在一些支持算术运算的命令中使用。
直接写为算术表达式自身,并不能进行算术运算。
使用算法表达式进行比较判断
在 bash 的 算法表达式中,支持 <=、>=<、>、==、!= 这 6 个常见的运算符,可用于进行比较判断。
假设有一个 arth_check.sh 脚本,内容如下:
(不好意思,近期网页版文章的代码块排版错乱,后台咨询确认网页版不支持。下面用四个 ‘----’ 代替四个空格来进行缩进和隔行显示。后面的代码块会类似处理。如果需要复制代码到本地验证,麻烦以四个 ‘----’为单位,替换成四个空格。非常抱歉。)
#!/bin/bash
if [ $# -ne 2 ]; then
----echo "Usage: $0 number1 number2"
----exit 1
fi
----
number1="$1"
number2="$2"
----
if ((number1 > number2)); then
----echo "$number1 > $number2"
elif ((number1 < number2)); then
----echo "$number1 < $number2"
elif ((number1 == number2)); then
----echo "$number1 == $number2"
else
----echo "Should never be here."
fi
这个 arth_check.sh 脚本要求提供两个参数,然后用算术表达式比较这两个参数值的大小关系。
使用 if ((number1 > number2)) 语句进行比较判断,变量名和 (( 和 )) 之间可以不加空格,也不需要对 > 操作符进行转义。
如果使用 [ 命令来比较,则变量名和 [ 和 ] 之间必须加空格,还要用 \ 对 > 操作符进行转义。
也就是写为 if [ number1 \> number2 ]。
可以看到,使用 if ((number1 > number2)) 这个写法更加简单方便,可以避免不加空格、或者不转义带来的异常。
执行 arth_check.sh 脚本,结果如下:
$ ./arth_check.sh 1 2
1 < 2
$ ./arth_check.sh 2 1
2 > 1
$ ./arth_check.sh 2 2
2 == 2
相关推荐
- 如何为MySQL服务器和客户机启用SSL?
-
用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...
- Mysql5.7 出现大量 unauthenticated user
-
线上环境mysql5.7突然出现大量unauthenticateduser,进mysql,showprocesslist;解决办法有:在/etc/hosts中添加客户端ip,如192.16...
- MySQL 在 Windows 系统下的安装(mysql安装教程windows)
-
更多技术文章MySQL在Windows系统下的安装1.下载mysql和Framework链接链接:百度网盘请输入提取码提取码:6w3p双击mysql-installer-communit...
- MySql5.7.21.zip绿色版安装(mysql数据库绿色版安装)
-
1、去网上下载满足系统要求的版本(mysql-5.7.21-winx64.zip)2、直接解压3、mysql的初始化(1)以管理员身份运行cmd,在mysql中的bin目录下shift+右键-在...
- MySQL(8.0)中文全文检索 (亲测有效)
-
在一堆文字中找到含有关键字的应用。当然也可以用以下语句实现:SELECT*FROM<表名>WHERE<字段名>like‘%ABC%’但是它的效率太低,是全盘扫描。...
- 新手教程,Linux系统下MySQL的安装
-
看了两三个教程。终于在哔哩哔哩找到一个简单高效的教程,成功安装,up主名叫bili逍遥bili,感兴趣可以去看看。下面这个是我总结的安装方法环境:CentOS764位1.下载安装包,个人觉得在...
- 麒麟服务器操作系统安装 MySQL 8 实战指南
-
原文连接:「链接」Hello,大家好啊,今天给大家带来一篇麒麟服务器操作系统上安装MySQL8的文章,欢迎大家分享点赞,点个在看和关注吧!MySQL作为主流开源数据库之一,被广泛应用于各种业务...
- 用Python玩转MySQL的全攻略,从环境搭建到项目实战全解析
-
这是一篇关于“MySQL数据库入门实战-Python版”的教程,结合了案例实战分析,帮助初学者快速掌握如何使用Python操作MySQL数据库。一、环境准备1.安装Python访问Pytho...
- 安装MySQL(中标麒麟 安装mysql)
-
安装MySQL注意:一定要用root用户操作如下步骤;先卸载MySQL再安装1.安装包准备(1)查看MySQL是否安装rpm-qa|grepmysql(2)如果安装了MySQL,就先卸载rpm-...
- Mysql最全笔记,快速入门,干货满满,爆肝
-
目录一、MySQL的重要性二、MySQL介绍三、软件的服务架构四、MySQL的安装五、SQL语句六、数据库相关(DDL)七、表相关八、DML相关(表中数据)九、DQL(重点)十、数据完...
- MAC电脑安装MySQL操作步骤(mac安装mysqldb)
-
1、在官网下载MySQL:https://dev.mysql.com/downloads/mysql/根据自己的macOS版本,选择适配的MySQL版本根据自己需求选择相应的安装包,我这里选择macO...
- mysql主从(mysql主从切换)
-
1、本章面试题什么是mysql主从,主从有什么好处什么是读写分离,有什么好处,使用mycat如何实现2、知识点2.1、课程回顾dubboORM->MVC->RPC->SOApro...
- 【linux学习】以MySQL为例,带你了解数据库
-
做运维的小伙伴在日常工作中难免需要接触到数据库,不管是MySQL,mariadb,达梦还是瀚高等其实命令都差不多,下面我就以MySQL为例带大家一起来了解下数据库。有兴趣的小伙伴不妨评论区一起交流下...
- 玩玩WordPress - 环境简介(0)(玩玩网络科技有限公司)
-
简介提到开源博客系统,一般都会直接想到WordPress!WordPress是使用PHP开发的,数据库使用的是MySQL,一般会在Linux上运行,Nginx作为前端。这时候就需要有一套LNMP(Li...
- 服务器常用端口都有哪些?(服务器端使用的端口号范围)
-
下面为大家介绍一下,服务器常用的一些默认端口,以及他们的作用: 21:FTP服务所开放的端口,用于上传、下载文件。 22:SSH端口,用于通过命令行模式远程连接Linux服务器或vps。 23:...
你 发表评论:
欢迎- 一周热门
-
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
手机如何设置与显示准确时间的详细指南
-
【系统配置】信创终端挂载NAS共享全攻略:一步到位!
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)