整数值运算

使用expr命令:只能做整数运算,默认返回计算结果

格式:

expr 整数1 运算符 整数2 ...

整数值可以有变量提供,直接给出运算结果

+      加法   expr 43 + 21 、expr $X + $Y
-   减法  expr 43 - 21 、expr $X - $Y
\* 乘法  expr 43 \* 21 、expr $X \* $Y
/ 除法  expr 43 / 21 、expr $X / $Y
% 取余数 expr 43 % 21 、expr $X % $Y 

例子:

#!/bin/bash
#计算用户从终端输入的任意2个数的和
read -p "请输入第一个数" num1
read -p "请输入第二个数" num2
sum=`expr $num1 + $num2`
echo "$num1 + $num2 = $sum"

使用$[]或$(())表达式

需借助echo输出结果,运算类型与expr类似
乘法*不用加转义符\
使用变量时,直接指定变量名,不用加$符号

shell中如何进行算术运算:

let 算术运算表达式           let C=$A+$B
$[算术运算表达式]         C=$[$A+$B]
$((算术运算表达式))        C=$(($A+$B))
expr 算术运算表达式,
表达式中各操作数及运算符之间要有空格,
而且要使用命令引用
C=`expr $A + $B`

表达式的简化

变量的递增、递减等操作

简写表达式    完整表达式
i++   i=i+
i--    i=i-
i*=   i=i*
i+=  i=i+
i-= i=i-
i%= i=i%

注意:

i++:先参与其他操作,后运算
++i:先运算,再参与其他操作

例子:

i=
echo $((++i))
j=
echo $((j++))

变量的自增/减等操作

使用let命令

操作变量值,只运算,不输出结果
若要查看结果,需借助echo命令
let:只做运算不返回计算结果,适用于自加和自减运算
#!/bin/bash
i=
let i-=
echo $i
let i-=
echo $i
echo -------------------
i=
let i+=
echo $i
let i+=
echo $i

变量的数值计算

变量的数值计算常用的有如下几个命令:

(())、let、expr、bc、$[]

1)(())用法:(此法很常用)

如果要执行简单的整数运算,只需将特定的算术表达式用”$((”和”))”括起来即可。

Shell的算术运算符号常置于”$((“......”))”的语法中。这一语法如同双引号的功能,除了内嵌双引号无需转义。

范例1:shell的运算实例如下:

[root@Web ~]# su - zgy

[zgy@Web ~]$ ((a=+**-%))

[zgy@Web ~]$ echo $a

[zgy@Web ~]$ b=$((+**-%))

[zgy@Web ~]$ echo $b

[zgy@Web ~]$ echo $((a=+**-%))

提示:上面是三种不同的变量计算定义和使用的方式

[zgy@Web ~]$ echo $((a+=))  #相当于a=a+

[zgy@Web ~]$ echo $((a++))

[zgy@Web ~]$ echo $((a--))

[zgy@Web ~]$ echo $((>))  #比较大小

[zgy@Web ~]$ echo $((<))

[zgy@Web ~]$ a=$((*(+)/))

[zgy@Web ~]$ echo $a

[zgy@Web ~]$ echo $((*(+)/))

提示:

1.**为幂运算;%为取模运算(就是除法当中取余数)

2.上面涉及到的参数变量必须为整数(整型)。不能为小数(浮点数)或者字符串。后面的bc命令可以进行浮点数运算,但一般较少用到。

3.echo $((a++))和echo $((a--))表示先输出a自身的值,然后再进行++--的运算,echo $((++a))和echo $((--a))表示先进行++--的运算,再输出a自身的值

记忆方法:变量在前,先输出变量值,变量在后,就是先运算后输出变量的值。

范例2:--,++在变量前后的举例理解:

[root@Web ~]# a=

[root@Web ~]# echo $((a++))   #先输出a的值,因为a为10,所以输出10

[root@Web ~]# echo $a  #上面输出a的值后,a自增1,因此为11

[root@Web ~]# echo $((a++))

[root@Web ~]# echo $a

[root@Web ~]# ((a++))

[root@Web ~]# echo $a

[root@Web ~]# a=

[root@Web ~]# echo $((a--))

[root@Web ~]# echo $a

[root@Web ~]# ((a--))

[root@Web ~]# echo $a

[root@Web ~]# echo $((++a))

[root@Web ~]# echo $a

[root@Web ~]# echo $((++a))

[root@Web ~]# echo $a

[root@Web ~]# echo $((++a))

[root@Web ~]# echo $a

[root@Web ~]# echo $((--a))

[root@Web ~]# echo $a

[root@Web ~]# echo $((--a))

[root@Web ~]# echo $a

范例3:定义变量计算的例子:

[root@Web ~]# myvar=

[root@Web ~]# echo $(($myvar + ))   

[root@Web ~]# echo $((  $myvar +   ))  #(())两边有几个空格不敏感,也可以没有

[root@Web ~]# myvar=$(( $myvar +  ))  #还可以赋值给变量然后输出变量

[root@Web ~]# echo $myvar

范例4:各种(())的计算命令行执行例子:

[root@Web ~]# echo $((/))   #除法,取商

[root@Web ~]# echo $((+))

[root@Web ~]# echo $((*))

[root@Web ~]# echo $((-))

[root@Web ~]# echo $((**)) #幂

[root@Web ~]# echo $((%))  #取模,余数

范例5:各种(())运算的shell脚本例子

[root@localhost ~]# cat test.sh

#!/bin/bash

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))"

echo "a%b =$(($a%$b))"

执行结果如下:

[root@localhost ~]# sh test.sh

a-b =

a+b =

a*b =

a/b =

a**b =

a%b =

范例6:这是一个实践考试题,内容如下:

请把a,b两个变量通过命令行传参的方式实现上面混合运算脚本的功能。

[root@localhost ~]# cat test1.sh

#!/bin/bash

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))"

echo "a%b =$(($a%$b))"

执行结果[root@localhost ~]# sh test1.sh 6 2

a-b =

a+b =

a*b =

a/b =

a**b =

a%b =

拓展:请实现一个加、减、乘、除等功能的计算器。通过命令行传参的方式实现上面脚本的功能。

答案:

[root@localhost ~]# cat d.sh

#!/bin/bash

echo$(($))

[root@localhost ~]# cat j.sh

#!/bin/bash

echo $(($$$))

[root@localhost ~]# sh j.sh +

[root@localhost ~]# sh j.sh -

学生例子:(如果敲不需要的内容会退出,待完善)

[root@localhost ~]# cat yubing_test.sh
#!/bin/bash
#add, subtract, multiply and divide by yubing
print_usage(){
printf "Please enter an integer \n"
exit
}
read -p "Please input first number: " firstnum
if [ -n "`echo $firstnum|sed 's/[0-9]//g' | sed 's/-//g'`" ];then
print_usage
fi
read -p "Please input the operators: " operators
if [ "${operators}" != "+" ]&&[ "${operators}" != "-" ] && [ "${operators}" != "*" ] && [ "${operators}" != "/" ];then
echo "please use + - * /"
exit
fi
read -p "Please input second number: " secondnum
if [ -n "`echo $secondnum|sed ' s/[0-9]//g' |sed ' s/-//g'`" ];then
print_usage
fi
echo "${firstnum}${operators}${secondnum}=$((${firstnum}${operators}${secondnum}))"

执行结果:

[root@localhost ~]# sh yubing_test.sh

Please input first number: 

Please input the operators: +

Please input second number: 

+=

[root@localhost ~]# sh yubing_test.sh

Please input first number: 

Please input the operators: *

Please input second number: 

*=

作业:完成一个简单的四则运算计算器功能

(2)let命令的用法

格式:

let 赋值表达式

[注]let 赋值表达式功能等同于:((赋值表达式))

范例1:给自变量i加8

[root@localhost ~]# i=

[root@localhost ~]# let i=i+

[root@localhost ~]# echo $i

[root@localhost ~]# i=i+  #去掉let定义

[root@localhost ~]# echo $i

i+

提示:let i=i+8等同于((i=i+8)),但后者效率更高

范例2:利用let计数监控web服务状态。

#!/bin/bash
#监控服务状态
ServerMonitor(){
#服务状态监控
timeout=
fails=
success=
while true
do
/usr/bin/wget --timeout=$timeout --tries- http://172.16.0.1/ -q -O /dev/null
if [ $? -ne ]
then
let fails=fails+
success=
else
fails=
let success=
fi
if [ $success -ge ]
then
exit
fi
if [$fails -ge ];then
Critical=" TMS 应用服务出现故障,请紧急处理!! "
echo $Critical | mutt -s " 服务 down " www.magedu.com
exit
fi
done }

(3)expr (evaluate expressions)命令的用法:

Expr命令一般用于整数值,但也可用于字符串,用来求表达式变量的值,同时expr也是一个手工命令行计算器

语法:expr Expression

[root@localhost ~]# expr  +

expr: 语法错误

[root@localhost ~]# expr  + 

[root@localhost ~]# expr  - 

[root@localhost ~]# expr  * 

expr: 语法错误

[root@localhost ~]# expr  \* 

[root@localhost ~]# expr  / 

[root@localhost ~]# expr  \*\* 

expr: 语法错误

[root@localhost ~]# expr  % 

[root@localhost ~]# expr +

+

提示:

1、注意:运算符左右都有空格

2、使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解星号的含义。

增量计数

Expr在循环中可用于增量计算。首先,循环初始化为0,然后循环值加1,反引号的用法为命令替换。最基本的一种是从(expr)命令接受输出并将之放入循环的变量。

例:给自变量i加1

[root@localhost ~]# i=

[root@localhost ~]# i=`expr $i + `

[root@localhost ~]# echo $i

expr $[$a+$b]表达式形式,其中$a$b可为整数值

[root@localhost ~]# expr $[+]

[root@localhost ~]# expr $[*]

[root@localhost ~]# expr $[**]

[root@localhost ~]# expr $[/]

[root@localhost ~]# expr $[%]

[root@localhost ~]# a=

[root@localhost ~]# b=

[root@localhost ~]# expr $[$a+$b]

expr将其后的串解释为表达式并计算其值,运算符前后须有空格

其它特殊的用法

expr用法ssh-copy-id

 [root@localhost ~]# less /usr/bin/ssh-copy-id

    if expr "$1" : ".*\.pub" > /dev/null ; then
# expr : id_dsa.pub:’.*\.pub’,匹配*.pub格式的文件如果是则为真。例
[root@localhost ~]# expr "id_dsa.pub" : ".*\.pub" #这里是匹配后字符数 #man expr STRING : REGEXP anchored pattern match of REGEXP in STRING

判断文件或字符串的扩展名小案例:

[root@localhost ~]# expr "test.pub" : ".*\.pub" && echo  || echo 

[root@localhost ~]# expr "test.x" : ".*\.pub" && echo  || echo 

技巧:通过expr判断变量是否为整数

[root@localhost ~]# cat judge_init.sh

#!/bin/bash

read -p "plus input:" a

expr $a +  &>/dev/null

[ $? -eq  ] && echo init || echo chars

[root@localhost ~]# sh judge_init.sh

plus input:q

chars

[root@localhost ~]# cat judge_init1.sh

#!/bin/bash

while true

do

    read -p "plus input:" a

    expr $a +  &>/dev/null >&

    [ $? -eq  ] && echo init || echo chars

Done

[root@localhost ~]# sh judge_init1.sh

plus input:

init

plus input:oldgirl

chars

plus input:123d

chars

plus input:q

chars

通过expr 计算字符串的长度

[root@localhost ~]# chars=`seq -s" " `

[root@localhost ~]# echo ${#chars}

[root@localhost ~]# echo $(expr length "$chars")

更多应用请man expr查看帮助

(4)bc命令的用法:

bc是UNIX下的计算器,它也可以用在命令行下面:

例:给自变量i加1

[root@localhost ~]# i=

[root@localhost ~]# i=`echo $i+|bc`   #效率低

[root@localhost ~]# echo $i

因为bc支持科学计算,所以这种方法功能非常强大

[root@localhost ~]# echo + | bc

[root@localhost ~]# echo 3.5+|bc

8.5

[root@localhost ~]# echo 3.5+5.6|bc

9.1

[root@localhost ~]# echo 3.5-3.1|bc

.

[root@localhost ~]# echo 3.5-2.1|bc

1.4

[root@localhost ~]# echo "5.23 * 3.13"|bc

16.36

[root@localhost ~]# echo "scale=1;5.23 * 3.13"|bc

16.36

[root@localhost ~]# echo "scale=1;5.23 / 3.13"|bc

1.6

[root@localhost ~]# echo "scale=6;5.23 * 3.13"|bc

16.3699

[root@localhost ~]# echo "scale=6;5.23 * 3.13"|bc -l

16.3699

[root@localhost ~]# echo "scale=3;5.23 / 3.13"|bc -l

1.670

[root@localhost ~]# echo "obase=2;8"|bc   #10进制8转换成2进制

[root@localhost ~]# echo "obase=16;20"|bc  #10进制20转换成16进制

通过表达式计算

[root@localhost ~]# seq -s "+" 

+++++++++

[root@localhost ~]# seq -s "+" |bc

特点:bc的特点是支持小数运算

(5)typeset命令的用法:

使用整数变量直接进行计算

例如:

[root@localhost ~]# typeset -i A= B=

[root@localhost ~]# A=A+B

[root@localhost ~]# echo $A

(5)$[]的用法:

实践操作演示:

[root@localhost ~]# echo $[  +  ]

[root@localhost ~]# echo $[  *  ]

[root@localhost ~]# echo $[+ ]

[root@localhost ~]# echo $[-]

[root@localhost ~]# echo $[*]

[root@localhost ~]# echo $[/]

[root@localhost ~]# echo $[**]

[root@localhost ~]# echo $[%]

Shell变量的输入

Shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入获得。

[语法格式]

read [参数][变量名]

[常见参数]

-p prompt:设置提示信息

-t timeout:设置输入等待的时间,单位默认为秒

范例1:read的基本读入

[root@localhost ~]# read -p "please input two number:" a1 a2  #红色部分要有空格

please input two number: 

[root@localhost ~]# echo $a1 $a2

提示:上面read -p 的功能可以用echo和read实现

echo -n "please input two number:"

read a1 a2

以上两句和下面的命令相当(-t排除在外)

[root@localhost ~]# read -t  -p "please input two number:" a1 a2

范例2:实践考试题

把前面的加减乘除计算的脚本改成通过read方式读入整数变量:

原始脚本:

[root@localhost ~]# cat test.sh

#!/bin/bash

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))"

echo "a%b =$(($a%$b))

答案:

[root@localhost ~]# cat read_01.sh

#!/bin/bash

read -t  -p "plus input two number:" 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))"

echo "a%b =$(($a%$b))"

[root@localhost ~]# sh read_01.sh

plus input two number: 

a-b =

a+b =

a*b =

a/b =

a**b =

a%b =

范例3:利用echo命令替代和read -p的功能

[root@localhost ~]# cat g.sh

#!/bin/bash

echo -n "please input two number:"

read 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))"

echo "a%b =$(($a%$b))"

[root@localhost ~]# sh g.sh

please input two number: 

a-b =

a+b =

a*b =

a/b =

a**b =

a%b =

范例4:思考:如果读入的不是整数,或者参数个数不是2个,以上shell脚本的执行会有什么结果?如何解决这两个问题?

方法1:

[root@localhost test]# cat read01.sh

#!/bin/bash

while true

do

    read -t  -p "pls input two number:" a b

    expr $a +  >/dev/null >&

    [ $? -ne  ] && continue

    expr $b +  >/dev/null >&

    [ $? -ne  ] && continue || break

done

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 ))"

方法2:命令行传参

[root@localhost test]# cat argv1.sh

#!/bin/bash

a="$1"

b="$2"

Usage() {

    echo "USAGE:sh $0 num1 num2"

    exit 

}

if [ $# -ne  ];then

    Usage

fi    

expr $a +  >/dev/null >&

[ $? -ne  ] && Usage

expr $b +  >/dev/null >&

[ $? -ne  ] && Usage

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 ))"

[root@localhost ~]# sh argv_01.sh kk yy

USAGE:sh argv_01.sh num1 num2

[root@localhost ~]# sh argv_01.sh kk 

USAGE:sh argv_01.sh num1 num2

[root@localhost ~]# sh argv_01.sh  

a-b =

a+b =

a*b =

a/b =

a**b =-

a%b =

[root@localhost ~]# sh argv_01.sh  

a-b =

a+b =

a*b =

a/b =

a**b =

a%b =

 

五、Shell运算的更多相关文章

  1. linux下的shell运算(加、减、乘、除)

    linux下的shell运算(加.减.乘.除) 标签: linuxshell运算加减乘除 2014-03-12 16:25 15127人阅读 评论(0) 收藏 举报 分类: linux(17) ((i ...

  2. linux下的shell运算(加、减、乘、除

    linux下的shell运算(加.减.乘.除 摘自:https://blog.csdn.net/hxpjava1/article/details/80719112 2018年06月17日 16:03: ...

  3. 五 shell 变量与字符串操作

    特点:1 shell变量没有数据类型的区分 2 Shell 把任何存储在变量中的值,皆视为以字符组成的“字符串”.    3  设定的变量值只在当前shell环境中有作用    4   不能以数字开头 ...

  4. shell 运算

    一个下午折腾一个脚本,shell好久不用,重新学起 一个小成果 size= ] do table=albums_index_${table_num} count=$size times= while ...

  5. let 与 expr Shell运算比较 let强强胜出

    Shell脚本中 整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 s 加 1 可以写作:let "s = $s + 1" 或者 s=`expr $s + 1'两 ...

  6. Linux基础(五) Shell函数

    Shell 函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action ...

  7. Shell 运算相关

    一.${str} 二.变量替换 三.3种计算字符串长度的效率比较 四.(())用法 五.expr 六.bc 4种连续整数求和效率 七.条件测试 八.字符串测试

  8. Linux学习笔记<五>——<Shell部分>

    管道命令(pipe) 1.把一个命令的输出作为另一个命令的输入 ls -al /etc | less 2.选取命令:cut和grep cut命令可以将一段消息的某段切出来. -d接分隔符,-f是取出第 ...

  9. 实验五 shell脚本编程

    项目 内容 这个作业属于哪个课程 课程链接 这个作业的要求在哪里 作业要求 学号-姓名 17041428-朱槐健 作业学习目标 1. 了解shell脚本的概念及使用 2.掌握shell脚本语言的基本语 ...

随机推荐

  1. SpringBoot整合Thymeleaf-基于SpringBoot2.X版本

    1.为啥要用Thymeleaf模板引擎?现在不都前后端分离了么? 熊dei们,别着急,我们先来谈谈为啥开始用Thymeleaf模板引擎,先照顾照顾下我们这些可爱的小白童鞋.... 为啥开始用Thyme ...

  2. 「CH2101」可达性统计 解题报告

    CH2101 可达性统计 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到 ...

  3. Spark学习笔记(二)—— Local模式

    Spark 的运行模式有 Local(也称单节点模式),Standalone(集群模式),Spark on Yarn(运行在Yarn上),Mesos以及K8s等常用模式,本文介绍第一种模式. 1.Lo ...

  4. 使用Eureka中遇到的一些问题

    1.情况 :   服务已经注册到eureka,eureka中可以看到,但是 consumer和provider这两个服务,一直报错, 错误信息:DiscoveryClient_CONSUMER-DEM ...

  5. ASP.Net Core 3.0 中使用JWT认证

    JWT认证简单介绍     关于Jwt的介绍网上很多,此处不在赘述,我们主要看看jwt的结构.     JWT主要由三部分组成,如下: HEADER.PAYLOAD.SIGNATURE HEADER包 ...

  6. [转]Linux制作启动盘

    假设你想备份一个叫做 /home/joeuser/ 的目录,但是不想包括子目录 /home/joeuser/junk/,因为其中包括的都是不必要的文件.你想创建一个叫做 backup.iso 的映像, ...

  7. MQ队列及常见操作

    一. 创建MQ队列管理器 1.1准备工作 到所安装websphere mq的机子上,进入/opt/mm/bin目录下,查询相关mq的情况,通过命令行./dspmq. 创建mq队列管理器的的时候要用mq ...

  8. 线段相交的异或值 (线段树 or 优先队列)

    VVQ 最近迷上了线段这种东西 现在他手上有 n 条线段,他希望在其中找到两条有公共点的线段,使得他们的异或值最大. 定义线段的异或值为它们并的长度减他们交的长度 输入描述: 第一行包括一个正整数 n ...

  9. AD19覆铜与边框间距设置方法

    转载请注明出处,并附带本文网址https://www.cnblogs.com/brianblog/p/9894867.html, 由于高版本AD不能将机械层直接转变为KEPP OUT LAYER层,所 ...

  10. Java入门 - 高级教程 - 08.Applet

    原文地址:http://www.work100.net/training/java-applet.html 更多教程:光束云 - 免费课程 Applet 序号 文内章节 视频 1 概述 2 Apple ...