五、Shell运算
整数值运算
使用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运算的更多相关文章
- linux下的shell运算(加、减、乘、除)
linux下的shell运算(加.减.乘.除) 标签: linuxshell运算加减乘除 2014-03-12 16:25 15127人阅读 评论(0) 收藏 举报 分类: linux(17) ((i ...
- linux下的shell运算(加、减、乘、除
linux下的shell运算(加.减.乘.除 摘自:https://blog.csdn.net/hxpjava1/article/details/80719112 2018年06月17日 16:03: ...
- 五 shell 变量与字符串操作
特点:1 shell变量没有数据类型的区分 2 Shell 把任何存储在变量中的值,皆视为以字符组成的“字符串”. 3 设定的变量值只在当前shell环境中有作用 4 不能以数字开头 ...
- shell 运算
一个下午折腾一个脚本,shell好久不用,重新学起 一个小成果 size= ] do table=albums_index_${table_num} count=$size times= while ...
- let 与 expr Shell运算比较 let强强胜出
Shell脚本中 整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 s 加 1 可以写作:let "s = $s + 1" 或者 s=`expr $s + 1'两 ...
- Linux基础(五) Shell函数
Shell 函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action ...
- Shell 运算相关
一.${str} 二.变量替换 三.3种计算字符串长度的效率比较 四.(())用法 五.expr 六.bc 4种连续整数求和效率 七.条件测试 八.字符串测试
- Linux学习笔记<五>——<Shell部分>
管道命令(pipe) 1.把一个命令的输出作为另一个命令的输入 ls -al /etc | less 2.选取命令:cut和grep cut命令可以将一段消息的某段切出来. -d接分隔符,-f是取出第 ...
- 实验五 shell脚本编程
项目 内容 这个作业属于哪个课程 课程链接 这个作业的要求在哪里 作业要求 学号-姓名 17041428-朱槐健 作业学习目标 1. 了解shell脚本的概念及使用 2.掌握shell脚本语言的基本语 ...
随机推荐
- 开源项目SMSS开发指南
SMSS是一个由我个人发起的开源项目,目的是建立一套轻量化,高可用,高安全和方便扩展的业务支撑框架.SMSS面向TCP/IP层开发,适合扩展上层业务接口.数据结构传输序列化通过Protobuf实现.传 ...
- ecshop数据结构
ecshop数据结构 2.7.2版本,数据库表 共88张表 注: 1.颜色为蓝色的字,有待讨论验证的地方. 2.颜色为红色的字,是新增的字段.(改文档是基于网上下载的老版本的数据字典修改而成,已经检 ...
- Eclipse和Tomcat的版本问题---已解决
Eclipse和Tomcat的版本问题---已解决 这篇文章主要是解决版本匹配的问题 我的电脑上装的是jdk10,如图: Tomcat装的是9: 接着配置好环境变量,直接上图: 然后启功Tomcat, ...
- Linux开发环境及应用—《第一、二周单元测验》
一单元 使用more命令逐屏显示文本文件时,使得显示内容上滚一行而不是滚动一屏,应按下哪个键? 回车 Linux中用来实现计数功能,比如:统计系统有多少个登录用户,实现计数功能的命令是: wc -l ...
- Vue+Vant+Vuex实现本地购物车功能
通常,我们做移动端商城的时候,通常会有购物车模块,那购物车模块有两种实现方式,一是储存在后台通过接口获取到购物车信息,二是存在用户手机本地,第一种方法只要调用接口获取比较简单,这里介绍的是第二种方法, ...
- K8S集群搭建
K8S集群搭建 摘要 是借鉴网上的几篇文章加上自己的理解整理得到的结果,去掉了一些文章中比较冗余的组件和操作,力争做到部署简单化. K8S组件说明 Kubernetes包含两种节点角色:master节 ...
- 【转】常见Java面试题 – 第三部分:重载(overloading)与重写(overriding)
ImportNew注: 本文是ImportNew编译整理的Java面试题系列文章之一.你可以从这里查看全部的Java面试系列. 这篇文章介绍的常见面试题是关于重载(overloading)方法和重写( ...
- css3实现左右div高度自适应且内容居中对齐
主要运用了css3的弹层布局,直接上代码: 效果:左边盒子宽度固定.内容居中对齐.与右侧盒子高度相等,右侧自动缩放 html: <div class="main"> & ...
- 做前端的你还没用这些软件?? out 啦
1. 编辑器 写代码只是生产软件过程中的一环.无论是数据结构.编译原理.操作系统还是组成原理都是编码的重要基础,试问没有学过编译原理的人能够针对性地进行编译优化吗?不懂操作系统的人能玩得转linux吗 ...
- 阿里开源服务发现组件 Nacos快速入门
最近几年随着云计算和微服务不断的发展,各大云厂商也都看好了微服务解决方案这个市场,纷纷推出了自己针对微服务上云架构的解决方案,并且诞生了云原生,Cloud Native的概念. 云原生是一种专门针对云 ...