Shell入门教程:算术运算

Bash的算术运算有以下几种方法:

序号名称语法范例
1算术扩展$((算术式))r=$((2+5*8))
2使用外部程序expr 算术式r=`expr 4 + 5`
3使用 $[]$[算术式]r=$[4+5]
4使用内置命令 declaredeclare -i 变量=算式式declare -i r=8+16
5使用内置命令 letlet 算术式let r=8+16

 

第一节:算术扩展

 

算术扩展语法:$((算术式))

如果表达式中有变量,该变量名称之前最好不要加$这个符号,以免该变量不存在时,造成语法的错误。

例如:

unset i
echo $((12+$i))

由于变量i不存在(行1),所以行2会变成:echo $((12+)),这样语法就错了。

但如果写成:

echo $((12+i))

这样可正确执行,因为 12+i 在$(())中是一个合法的算术表达式,就算变量i不存在,仍然可正确计算(结果为 12)。

如果表达式中有“变量扩展”,则要加上$,例如: echo $((${j:-8}+2))。

这里强化一下印象:

$((12+i))正确范例
$((12+$i))当i不存在时,语法错误,不建议使用
$((12+${i}))当i不存在时,语法错误,不建议使用
$((${j:-8}+2))表达式中有“变量扩展”的正确范例

以下是各种简单的算术运用:

1、加 r=$((6+5)):r的值为11。

2、减 r=$((6-5)):r的值为1。

3、乘 r=$((6*5)):r的值为30。

4、除 r=$((6/5)):r的值为1。注意,这是整除。

5、求余数 r=$((32%3)):r的值为2。

6、递增 1

r=6
r=$((++r))

行2,r的值加1后,在赋值给r,因此,r的值递增1,变成7。

7、递减1

r=6
r=$((--r))

行2,r的值减1后,再赋值给r,因此,r的值递减1,变成5.

8、运算后减1

m=6
r=$((4+m--))

行2,m的值先代入6,和4做加法运算,得值为10,再赋值给r。接着,m的值减1。运算结果:r=10,m=5。

如果要对变量本身做单元的算术运算,可使用 (()) 含括,这一点和 C 语言的语法很像。

如下所示:

1、指定运算

((i=168))

设定变量i的值为168

2、后置式递增

i=168
((i++))

i的值加1,变成169。

第2行改成前置式递增 ((++i)) 也可以。

3、后置式递减

i=168
((i--))

i的值减1,变成167.

第2行改成前置式递减 ((--i)) 也可以。

4、+= , -= , *= , /= 等 赋值运算

i=168
((i+=60))

i+=60 的意思同于 i=i+60,即i加上60后,把运算结果再赋值给i,i的值变成228。

5、三元表达式

i=168
((n=i<100?50:80))
echo $n

(()) 的用户其实和 let 的效果是一样的,例如:((i++)) 和 let "i++" 执行结果相同。可以把上述的 (())的用法都改用 let 来做。

 

第二节:使用外部程序 expr 做算术运算

 

外部程序 expr 本来作用,是在“标准输出”显示表示式的值。语法为:

expr '算术式'

 例如:

expr 3 + 2

它会在屏幕上显示 5。

利用这个特性,expr 就可以拿来当做一种算术运算的工具。而且,由于它是外部程序,和Shell的版本没什么关系,几乎在各种操作系统平台上都可以执行。因此,如果注重跨平台、可移植性,在script程序的开发上可以使用expr替代其他算术方法。

在使用expr时,要特别注意“算术式”中是否含有bash shell的特殊字符,如 *、|、<、>、!、&、(、)等。如果有的话,要用 \ 予以转义,否则会出现奇怪的错误信息。

另外,在“算术式”中,运算符合操作数之间,至少要有一个以上的空格符隔开

以下是 expr 的范例(请注意,这里是使用一对 ` 符号含括,而不是单引号):

1、r=`expr 参数1 \| 参数2`

| 代表“或”之意。如果“参数1”存在、非空、不是0,则传回“参数1”的值,否则,传回“参数2”的值。由于 | 是特殊字符,所以要写成转义字符 \| 。

用例:

r=`expr 3 \| 0`

r的值为3。

r=`expr 0 \| 2`

r的值为2。

2、r=`expr 参数1 \& 参数2`

如果“参数1”和“参数2”皆存在、非空、不是0,则传回“参数1”的值,否则传回0。

用例:

r=`expr 3 \& 0`

3、加

r=`expr 4 + 5`

r的值为9。

4、减

r=`expr 4 - 5`

r的值为-1。

5、递减1

r=5
r=`expr $r + 1`

 

第三节:使用$[]做算术运算

 

使用$[]做算术运算和$(())类似。

语法:r=$[算术式]

以下列出简单的算术运用:

1、加:r=$[4+5]

2、减:r=$[4-5]

3、乘:r=$[4*5]

4、除:r=$[22/5] (整除)

5、求余数:r=$[100%43],r的值为14。

6、递增1

r=5
r=$[r+1]

 

第四节:使用内置命令 declare 做算术运算

 

语法:declare -i 变量=算式式

例如:

declare -i k
k=8+16echo $k

行1,使用declare事先设定变量k的属性为“整数”。

行2,由于k是整数,8+16就不再是字符串,而是一个算式,因此,bash会对它进行运算,最后把结果24赋值个k。

必须注意的是:

  • 算式中,运算符和操作数之间不可以有空格符,要紧密连接。
  • 特殊符号不必使用 转义。例如:乘法*,乘法**。
  • 算式中,可包含其他变量,变量之前不必加上$。

使用 declare -i 设定变量之后,加减乘除等运算,就非常直观了:

declare -i kk=8+16
k=16-8
k=5*3
k=22/5
k=2**3
k=100%43declare -i j
j=k+1  #或 j=$k+1
echo $j

行3~8,分别是加、减、乘、除、乘方、求余数等运算。

行10,设定变量j也是整数。

行11,算式中可以包含变量,但不必加上‘$’;k的变量值代入其中,加1后,赋值给变量j。

 

第五节:使用内置命令 let 做算术运算

 

let 的用法也很简单,其注意事项同 declare。

以下是let的范例:

let k=8+16
let k=16-8
let k=5*3
let k=22/5
let k=2**3
let k=100%43
let j=k+1

其意自明,这里就不再赘述了。

另外,可以使用“空格符”让表达式可读性高一些,但这时,必须使用“引号”含括表达式才行,比如:

let "k = k + 5"

 

转载于:https://www.cnblogs.com/52php/p/5669921.html

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

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

相关文章

计算器、中文转数字

计算器 1.字符串转整数 string s "458";int n 0; for (int i 0; i < s.size(); i) {char c s[i];n 10 * n (c - 0); } // n 现在就等于 458 2.处理加减法 我们拿字符串算式1-123为例&#xff0c;来说一个很简单的思路&#xff1a; 1、先给第一个数字加…

前端学习(2009)vue之电商管理系统电商系统之渲染商品属性的结构

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

配置CNPM-基础案例

下面给出一个样例配置&#xff1a; JavaScript module.exports { enableCluster: true, database: { db: "snpm", username: "username", password: "password", dialect: "mysql", host: "127.0.0.1", port: 3306 }, en…

浏览器上请求URL的全部过程

分为六步 1. 域名解析   浏览器首先要做去获得想访问网页的IP地址&#xff0c;浏览器会发送一个UDP的包给DNS域名解析服务器。DNS就会返回给我们百度的IP地址&#xff0c;通常来说浏览器会把访问过的网站的IP保存下来&#xff0c;这样下次访问的时候就会快很多&#xff0c;能…

前端学习(2013)vue之电商管理系统电商系统之监听on-success事件

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

常见算法复习整理1

数据结构笔记 1.迭代与递归 递归过程中的递归因子本身可以被忽略&#xff08;被计入它自己的过程中了&#xff09; 递归跟踪、递推方程。递归基 减而治之&#xff1a;Decrease and Conquer 线性递归的模式 T(n) T(n-1) O(1) 分而治之&#xff1a;Divide and Conquer 一般…

MVC5中利用NOPI导出EXCLE

MVC5中利用NOPI导出EXCLE //导出excle 设备效率public JsonResult Exporta(){var jser new JavaScriptSerializer();string js1 Request.Params["rows"].ToString();string js2 Request.Params["columns"].ToString();DataTable dt1 JsonToDataTable.J…

前端学习(2014)vue之电商管理系统电商系统之监听on-remove事件

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

Ubuntu彻底删除MySQL重装MySQL

1、删除 mysql sudo apt-get autoremove --purge mysql-server-5.0 sudo apt-get remove mysql-server sudo apt-get autoremove mysql-server sudo apt-get remove mysql-common //这个很重要 2、清理残留数据 dpkg -l |grep ^rc|awk {print $2} |sudo xargs dpkg -P 3、安装 …

HIT计网笔记

一、实践课笔记 1. 路由器连接的是两个不同的网络&#xff0c;交换机连接的是同一个网络。路由器负责在不同网段转移数据&#xff0c;交换机看mac地址&#xff0c;路由器看ip地址。 2. 子网掩码可以分离出IP地址中的网络地址和主机地址&#xff0c;同一个网络的网络地址相同&…

前端学习(2015)vue之电商管理系统电商系统之实现图片的预览效果

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

获取数字的位数

一个整数由个位、十位、百味...组成&#xff0c;我们知道整数可以用int型表示&#xff0c;那么一个整数到底是几位数呢&#xff1f;&#xff1f; 下面这个代码就是来计算位数的&#xff1a; #include<stdio.h>// 获得num的位数 int getbit(int num) {if(num 0)return 0…

几种排序与最大K问题

图片链接 0. 链表归并和快排 链表排序常用归并&#xff0c;但是快排面试常出&#xff1b; 一定要理解归并的本质&#xff1a; 两步走&#xff1a; 1. 先切分成(有序)两部分&#xff0c;此处各部分都是有序的 2. 两部分有序合并 切分成两部分的最小粒度是一个元素&#…

前端学习(2016)vue之电商管理系统电商系统vue-quill-editor

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

多线程知识

同步:多个任务依次按顺序执行 异步:多个任务可以时执行 进程:一个正在运行的应用程序就是一个进程,为应用开辟内存空间 线程:一个进程可以有多个线程,是进程的基本执行单元,执行应用的代码/任务 NSThread: 创建线程 方法一:对象方法 NSThread *thread [[NSThread alloc]initWi…

经典算法题:字典树、并查集、单调栈、二分、带标记函数dp、树、全排列、字符串问题等常用算法

0. Tips 1. 位运算 如何枚举一个二进制状态数字k的子集, 方法就是针对中的二进制为1的位开始进行减法&#xff0c;判断数字k的二进制子集, 像枚举(2^k-1) ~ 0一样枚举其子集&#xff1b; int sub k;do {sub (sub - 1) & k;} while(sub ! k); 比如k 10101的二进制子集…

web窗体的内置对象

内置对象&#xff1a;1、Response - 响应请求对象 Response.Redirect("Default2.aspx"); //重定向 Response.Write("<script>window.open(Default2.aspx);</script>"); ---可以书写任何东西&#xff0c;直接输出出去2、Request - 接收请求对象…

前端学习(2017)vue之电商管理系统电商系统实现表单的预先认证

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

Docker有什么好处?

Docker背后的想法是创建软件程序可移植的轻量容器&#xff0c;让其可以在任何安装了Docker的机器上运行&#xff0c;而不用关心底层操作系统&#xff0c;类似船舶使用的集装箱&#xff0c;野心勃勃的他们成功了。 Docker可以解决虚拟机能够解决的问题&#xff0c;同时也能够解决…

前端学习(2018)vue之电商管理系统电商系统把good_cat转换为字符串

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…