Shell编程之变量数值计算(一)

Stella981
• 阅读 675

如果要执行运算,那就少不了运算符,和其他的编程语言相似,shell也有很多的运算符如下:

+、-、:代表着加号 和减号 或者,负号
*、/、%:代表着乘号,除号,和取模。
**   : 幂运算
++、-- :表示着增加或者减少,它可以放在前置,也可以放在变量的结尾
!、||、&&、(取反)(或) (and)
<、<=、>、>=  :比较符号,小于、小于等于、大于、大于等于
==、!=、= :相等,不相等, =表示相等于
<<     >>  向左移动 向右移动
等等,这里就不说了 到后面实践中再见!

Shell编程之算术运算命令
(())  用于整数之间常用的运算符,效率高
let :用于整数运算,类似于(())
expr :用于整数运算,但是还有其他功能
bc :Linux下的一个计算程序,适合整数及小数运算
$[] :用于整数运算
awk:awk既可以整数运算,也可以小数运算
declare: 定义变量值和属性,-i参数可以用于定义整形变量,做运算

第一眼看到这些 感觉很复杂,心乱,但是没有关系,慢慢的就好了~~~

一、双小括号(()) 数值运算命令
双小括号的作用是进行数值运算与数值的比较,它的效率很高,用法很灵活,是企业运维人员经常采用的操作符
((e=e+1)) 它的作用就是把e+1的结果赋值给变量e但是不可以用 echo ((e=e+1))来使用,但可以使用echo $((e=e+1))
e=$((e=e+1)) 作用就是把e+1的执行结果赋值给变量e
数值比较
((8>7&&5==5)) 用于数值之前的比较,用于条件判断
echo $((2+1)) 用于直接输出运算表达式的结果,在(()) 前面加$符号

案例1:双小括号"(())"数值运算实践

[root@shell-yankerp sh]# echo $((1+1))  #计算1+1后输出  
2         #那么结果就是等于2  
[root@shell-yankerp sh]#

以此类推使用减号

[root@shell-yankerp sh]# echo $((6-3))  #计算6-3等于多少  
3    #结果为3  
[root@shell-yankerp sh]#

是不是感觉有点简单。那么接下来利用"(())"进行稍微复杂的一些综合算术运算

[root@shell-yankerp sh]# ((a=1+2**3-4%3))

以上例子也就是说,首先a是一个变量名,那么在a=后面的一些计算的结果会赋值给a这个变量,那么首先我们得知道后面的计算结果是多少,在这个变量中 我们用到了+号"**"以及"-"号包括“%”首先计算过程是这样的。先算乘除,后算加减

2**3 等于 2x2x2=8 乘算出来之后算除。 4%3=1 取模---- 8-1=7 最后1+7=8 最后结果为8 输出如下:

Shell编程之变量数值计算(一)

例如2:

[root@shell-yankerp sh]# b=$((1+2**3-4%3)) #在这里b是一个变量 将变量名的计算结果赋值给b  
[root@shell-yankerp sh]# echo $b         #输出如下:  
8  
[root@shell-yankerp sh]#

其实例1 和2都是差不多的 只不过是用了不同的方法!!!

例3:特殊运算符号的运算实例

[root@shell-yankerp sh]# a=8        #首先a变量名 = 变量值 等于8 那么a就是8  
[root@shell-yankerp sh]# echo $((a=a+2))  #原来a=8 那么现在a+2 结果为10  
10  
[root@shell-yankerp sh]# echo $((a+=1))   #当结果为10 这一行代表 a=a+1那么就等于11  
11  
[root@shell-yankerp sh]# echo $((a**2))   #目前a=11 那么a**2 a的二次方 那么等于11x11=121 输出如下:  
121  
[root@shell-yankerp sh]#

例4:利用(())双括号,进行比较判断

[root@shell-yankerp sh]# echo $((2>1))  #当条件2>1正确后输出了1表示真  
1  
[root@shell-yankerp sh]# echo $((2>3))  #当条件2>3错误后输出0  
0  
[root@shell-yankerp sh]# echo $((6==6)) #6==6 那么就输出1  
1  
[root@shell-yankerp sh]#

if 判断小实战

Shell编程之变量数值计算(一)

在以上的图中不用想肯定是输出条件成立继续运行了因为8本来就大于5;7本来就等于7 输出如下:

Shell编程之变量数值计算(一)

我们尝试的改下脚本如下:

Shell编程之变量数值计算(一)

在上图中8等于5肯定是错误的 那么输出如下:

Shell编程之变量数值计算(一)

上面涉及到了数字及变量必须为整数,不能是小数... 但是可以用bc来解决后面会说到。

案例:在变量前后使用++、--、特殊运算符的表达式

首先我们需要知道++是什么意思

++、-- :表示着增加或者减少,它可以放在前置,也可以放在变量的结尾

[root@shell-yankerp sh]# a=10  
[root@shell-yankerp sh]# echo $((a++))  
10  
[root@shell-yankerp sh]# echo $a  
11  
[root@shell-yankerp sh]#

以上内容中的a=10 那么a是变量名 变量值等于10 那么echo $((a++)) ++的意思上面已经说过了,输出结果为10 因为++在a的后面 所以先输出a的值为10 那么继续echo $a 那么就变成11 因为a++后面增加1

例2:

[root@shell-yankerp sh]# a=11  
[root@shell-yankerp sh]# echo $((a--))  
11  
[root@shell-yankerp sh]# echo $a  
10  
[root@shell-yankerp sh]#

以上就是--的用法了。这里不在说了

在以下的案例中我相信的大家肯定知道了在前面加++ 和在后面加++的区别了 如下:

[root@shell-yankerp sh]# echo $a  
10  
[root@shell-yankerp sh]# echo $((--a))  
9  
[root@shell-yankerp sh]# a=9  
[root@shell-yankerp sh]# echo $a  
9  
[root@shell-yankerp sh]# echo $((++a))  
10  
[root@shell-yankerp sh]#

例:通过(())运算后赋值给变量

[root@shell-yankerp sh]# yankerp=99  
[root@shell-yankerp sh]# echo $((yankerp+1))  
100  
[root@shell-yankerp sh]# echo $(( yankerp+1  ))  
100  
[root@shell-yankerp sh]#

在以上的案例中,有空格和没空格都是一样的。

包含(())各种常见的运算符命令执行如下:

[root@shell-yankerp sh]# echo $((3+2))  
5  
[root@shell-yankerp sh]# echo $((3-2))  
1  
[root@shell-yankerp sh]# echo $((3**2))  
9  
[root@shell-yankerp sh]# echo $((3*2))   
6  
[root@shell-yankerp sh]# echo $((3/2))  
1  
[root@shell-yankerp sh]# echo $((3%2))  
1  
[root@shell-yankerp sh]#

各种(())运算的shell脚本案例

#!/bin/bash  
# DATE:Wed Jan 31 19:49:59 CST 2018  
# This is a yankerp!  
  
a=6  
b=3  
echo "a-b=$((a-b))"  
echo "a+b=$((a+b))"  
echo "a/b=$((a/b))"  
echo "a**b=$((a**b))"

输出结果为如下:

[root@shell-yankerp sh]# sh test.sh   
a-b=3  
a+b=9  
a/b=2  
a**b=216  
[root@shell-yankerp sh]#

特殊位置变量+数值运算实战案例如下:

在以上的脚本中 我们定义了特殊的位置变量 下面定义了数值运算,那么这个脚本的功能是,当我们输入两个字符,其中第一个字符赋值给了变量a 第二个字符赋值给了变量b 那么在下面进行数值运算。

运行结果如下

[root@shell-yankerp sh]# sh test.sh 6 3  
a-b=3  
a+b=9  
a**b=216  
a/b=2  
[root@shell-yankerp sh]#

这也就是特殊位置变量+本章的变量数值运算的结合

let运算命令的用法

例如

[root@shell-yankerp ~]# a=2     
[root@shell-yankerp ~]# a=a+8   #没有用let  
[root@shell-yankerp ~]# echo $a  
a+8   #输出结果  
[root@shell-yankerp ~]# unset a  #清除变量   
[root@shell-yankerp ~]# a=2  
[root@shell-yankerp ~]# let a=a+8  使用let  
[root@shell-yankerp ~]# echo $a  
10  
[root@shell-yankerp ~]#

其实还可以这么实现,如下:

[root@shell-yankerp ~]# a=2  
[root@shell-yankerp ~]# echo $((a=a+8))  
10  
[root@shell-yankerp ~]# echo $a  
10  
[root@shell-yankerp ~]# unset  a  
[root@shell-yankerp ~]# a=2  
[root@shell-yankerp ~]# let a=a+8  
[root@shell-yankerp ~]# echo $a  
10  
[root@shell-yankerp ~]#

两者区别!!!如上

expr命令用法实例:

[root@shell-yankerp sh]# expr 2 + 2  
4  
[root@shell-yankerp sh]# expr 4 - 2  
2  
[root@shell-yankerp sh]# expr 4 \* 2  
8  
[root@shell-yankerp sh]# expr 4 / 2   
2  
[root@shell-yankerp sh]#

当我们选择用*号需要拿\转义、需要注意在用expr命令时 左右两侧必须要空格

2、expr配合变量实例

[root@shell-yankerp sh]# a=10  
[root@shell-yankerp sh]# a=`expr $a + 10`  
[root@shell-yankerp sh]# echo $a  
20  
[root@shell-yankerp sh]#

expr的企业级实战案例:

[root@shell-yankerp sh]# i=5   #这里设置了一个变量 i=5  
[root@shell-yankerp sh]# expr $i + 6 &>/dev/null   #那么我们使用expr命令 $i + 6 这里的6是一个整数  
[root@shell-yankerp sh]# echo $?   #执行完成后我们使用特殊变量 $?来判断以上命令  
0         ---返回结果为0  
[root@shell-yankerp sh]# expr $i + zhangsan &>/dev/null #同时这里又设置了一个变量 在这里的zhangsan是字符串  
[root@shell-yankerp sh]# echo $?       #使用特殊变量判断  
2     #结果为2   
[root@shell-yankerp sh]#

利用expr做计算,将一个未知的变量和一个已知的一个整数相加,看返回的值是否为0,如果默认是0 那么就是一个整数。如果非0则输入的就是字符串不是整数。

例:通过参数判断输出内容是否为整数

#!/bin/bash  
expr $1 + 1 &>/dev/null   #这里是一个命令 使用了expr 也使用了特殊的位置变量  
if [ "$?" -eq 0 ]         #如果以上命令执行结果为0   
  then           #那么  
    echo "输入的是整数~"   #输出一条 输入的是整数  
  else     #否则  
    echo "/bin/sh $# 请输入一个整数"     这里也使用了特殊的位置变量  
fi

运行脚本测试

[root@shell-yankerp sh]# cat aaa.sh   
#!/bin/bash  
expr $1 + 1 &>/dev/null  
if [ "$?" -eq 0 ]  
  then  
    echo "输入的是整数~"  
  else  
    echo "/bin/sh $0 请输入一个整数"  
fi  
[root@shell-yankerp sh]# sh aaa.sh 123  
输入的是整数~  
[root@shell-yankerp sh]# sh aaa.sh zhangsan lisi  
/bin/sh aaa.sh 请输入一个整数  
[root@shell-yankerp sh]#

Shell编程之变量数值计算(一)
实战:第一关判断参数个数是否为2.若不是请给出提示

第二关判断参数是否为整数,如果不是那么继续给出提示

第三关做运算~~~

#!/bin/bash  
if [ "$#" -ne "2" ]  
  then  
    echo "/bin/bash $0 请输出两个数值..."  
    exit 1  
fi  
#no.2  
a=$1  
b=$2  
expr $1 + 1 &>/dev/null  
if [ "$?" -ne "0" ]  
  then  
    echo "请输入数值..."  
    exit 1  
fi  
#no.3  
echo "a+b=$((a+b))"   
echo "a-b=$((a-b))"  
echo "a/b=$((a/b))"  
echo "a*b=$((a*b))"  
echo "a**b=$((a**b))"  
echo "a%b=$((a%b))"

剖析:在以上脚本中其实很简单,第一if 如果输入的不是两个传参值,那么给出提示 这是第一段if条件语句,如果输入的是两个数值,那么继续执行下面的条件,在第二个条件使用了位置参数变量$1 使用了expr命令来判断用户输入的是数字还是字符串,当用户输入的是数字那么就是返回是成功的 那么我们使用了if语句 如果上面命令执行成功 如果不等于0 那么给出相应的提示,最后前面的两个条件成立,那么接下来进行算法,这个前面是说过的。

执行脚本如下:

Shell编程之变量数值计算(一)
好了 本次就到这里,希望阅读者快快吸收~~~ 后续不断更新 谢谢大家

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这