shell_脚本开发_数值运算
shell中的数值运算
shell中常见的算术运算符
运算符 | 意义(*表示常用) |
---|---|
+、- | 加号(正号)、减号(负号)* |
*、/、% | 乘号、除号、取余(取模)* |
** | 幂运算 * |
++、-- | 增加及减少,可前置也可放在变量结尾* |
!、&&、|| | 逻辑非(取反)、逻辑与(and)、逻辑或(or)* |
<、<=、>、>= | 比较符号(小于,小于等于,大于,大于等于) |
==、!=、= | 比较符号(相等,不相等,对于字符串'='也可以表示相等) * |
<<、>> | 向左移、或向右移 |
~、|、&、^ | 按位取反,按位异或,按位与,按位或 |
=、+=、-=、*=,/=、%= | 赋值运算符,例如a+=1相当于a=a+1 |
shell中常见的算术运算命令
运算操作符与运算命令 | 意义 |
---|---|
(()) | 相当于整数运算的常用运算符,效率很高 |
let | 用于整数运算类似"(())" |
expr | 可以用于整数运算,但还有其他的额外功能 |
bc | Linux下的一个计算器程序(适合整数及小数运算) |
$[] | 用于整数运算 |
awk | awk即可用于整数运算,也可以用于小数运算 |
declare | 定义变量值和属性,-i参数可以用于定义整形变量,做运算 |
用于数值计算的命令
- 双小括号(())
运算操作符与运算命令 | 意义 |
---|---|
((i=i+1)) | 此写法为运算后赋值法,即将i+1的结果赋值给变量i。注意,不能用echo ((i=i+1))的形式输出表达式的值,但可以用echo $((i=i+1) |
i=$((i+1)) | 可在(())符号前面加$符,表示将表达式运算结果赋值给i |
((8>7&&5==5)) | 可以进行比较操作,还可以加入逻辑与和逻辑或,用于条件判断 |
echo $((2+1)) | 需直接输出运算表达式的运算结果时,可在(())前加$符 |
[root@localhost ~]# #加减乘除
[root@localhost ~]# echo $((1+3))
4
[root@localhost ~]# echo $((3-10))
-7
[root@localhost ~]# echo $((10/3))
3
[root@localhost ~]# echo $((10/3)) #除法取商
3
[root@localhost ~]# echo $((10%3)) #取余取模运算
1
[root@localhost ~]# echo $((2**3)) #幂运算
8
[root@localhost ~]# echo $((1.5+1))
bash: 1.5+1: 语法错误: 无效的算术运算符 (错误符号是 ".5+1")
[root@localhost ~]#
##############变量等赋值运算
[root@localhost ~]# echo $i
[root@localhost ~]# i=5
[root@localhost ~]# ((i*5))
[root@localhost ~]# echo $i
5
[root@localhost ~]# ((i=i*5)) ###只计算并未赋值
[root@localhost ~]# echo $i
25
[root@localhost ~]# echo ((i=i*5)) ###语法错误
bash: 未预期的符号 `(' 附近有语法错误
[root@localhost ~]# echo $i
25
[root@localhost ~]# echo $((i=i*5))
125
[root@localhost ~]# echo $i
125
[root@localhost ~]#
#####复杂的运算;明确(())这个shell扩展计算的语法,在括号里面支持变量的定义,赋值操作,算法的优先级与数学运算一致
[root@localhost ~]# echo $a
[root@localhost ~]# ((a=2+2**3-4%3))
[root@localhost ~]# echo $a
9
[root@localhost ~]# 写法2,变量赋值在括号外面,必须加$符号,否则报错
[root@localhost ~]# b=((2+2**3-4%3)) ##未加$符号报错。
bash: 未预期的符号 `(' 附近有语法错误
[root@localhost ~]# b=$((2+2**3-4%3))
[root@localhost ~]# echo $b
9
[root@localhost ~]# 写法3,不用变量接收,直接获取值也需要$
root@localhost ~]# ((2+2**3-4%3))
[root@localhost ~]# echo ((2+2**3-4%3))
bash: 未预期的符号 `(' 附近有语法错误
[root@localhost ~]# echo $((2+2**3-4%3))
9
[root@localhost ~]#
#######################也可以直接简单写
[root@localhost tmp]# cat calcualation2.sh
#!/bin/bash
echo "$(($1))"
[root@localhost tmp]# sh calcualation2.sh 1+2 ###因脚本只有一个参数,所以注意不要空格
3
[root@localhost tmp]#
注意 shell的一些基础命令,只支持整数的运算,小数的计算需要如bc这类方法才行
- 特殊符号 (++;--)
++ 加一
-- 减一
++a 先计算+1,再赋值给a
a++ 先对变量a操作,再进行+1
[root@localhost ~]# echo $a
[root@localhost ~]# a=5
[root@localhost ~]# echo $((++a))
6
[root@localhost ~]# echo $a
6
[root@localhost ~]# echo $((a++)) ###先把a的值赋值过去,最后再加1
6
[root@localhost ~]# echo $a
7
[root@localhost ~]#
注意面试常遇到:echo $((a++)) 是先把a的值赋值出去,然后再加1
- let 命令:let命令的执行,效果等同于双小括号(()),但是双小括号效率更高
###let实践
[root@localhost tmp]# num=8
[root@localhost tmp]# num=num+8
[root@localhost tmp]# echo $num
num+8
[root@localhost tmp]# num=$num+8
[root@localhost tmp]# echo $num #####可以看出bash的基础是不支持运算的
num+8+8
[root@localhost tmp]# unset num
[root@localhost tmp]# num=5
[root@localhost tmp]# let num=num+5 ###let 命令等效于双小括号(())
[root@localhost tmp]# echo $num
10
[root@localhost tmp]# num2=5
[root@localhost tmp]# echo "$((num2=num2+5))"
10
[root@localhost tmp]#
- expr命令
应用实例
-
脚本开发,复杂的对用户输入判断的脚本开发
该脚本开发,利用到了部分后期内容,涉及shell函数,if 判断逻辑
脚本开发的思路
-
想好脚本的功能,作用,以及需求
-
转换为shell代码
###eg1,开发一个,接收用户输入的数字,且对运算符号判断,最终得出结果的一个计算脚本 ##分析步骤 #1.接收用户输入 #2.对用户输入的是不是数字进行判断 #3.对输入的运算符号进行判断 #4.最终进行结果结算 ###vim calculation.sh #!/bin/bash #脚本开发 #函数的作用,就是把你写的功能代码,进行打包,封装成一个函数名,然后调用该函数名,函数就会执行 #函数体中的代码就会执行 print_usage(){ echo "hello Peter" printf "Please enter an integer\n" #给脚本的执行结果,赋予一个状态码,退出码 exit 1 ###程序结束并返回错误代码1 } #接收用户输入命令,-p参数后面写给用户看到的提示信息 #read -p "提示信息" 接收用户收入的变量 read -p "Please input your number: " firstnum #进行对用户输入判断,使用if语句 #注意语法格式 #限制用户必须输入存数字 #中括号里面前后必须有一个空格 ,是固定写法 #-n 参数是if 的语句,对字符串判断,如果字符串为空,条件就不成立;如果字符串不为空,条件成立 #如果用户录入abc123 #sed的作用就是把上述的字符串"abc123"中的数字替换成空,就剩下非数字内容 #如果输入的存数字123,则下面的if语句不成立,不执行函数。 ##echo "录入值:${firstnum}" ##echo "录入值截取后:`echo ${firstnum} |sed 's/[0-9]//g'`" if [ -n "`echo ${firstnum}|sed 's/[0-9]//g'`" ] ###注意-n后面必须加上""不加""时该if语句等效于if [ -n ],shell 会把它当成if [ str1 ]来处理,-n自然不为空;注意""不要带上空格类似 " `echo ${firstnum}|sed 's/[0-9]//g'` "否则也是会出问题,应该是估计空格也判定了长度自然也不为空 then print_usage fi #上面的代码都是对用户输入的进行判断。 #假设希望用户输入3+5这类 #此时对运算符进行判断 read -p "Please input your operator: " operator #对运算符进行判断 #限制在+ - * /四个符号 if [ ${operator} != "+" ]&& [ $operator != "-" ]&&[ $operator != "*" ]&& [ $operator != "/" ] then echo "只允许输入+|-|*|/" exit 2 ###程序结束并返回错误代码2 fi #对第二个函数变量进行处理 read -p "Please enter second number : " secondnum if [ -n "`echo $secondnum|sed 's/[0-9]//g'`" ] then print_usage fi #最后进行数字计算;用(()) echo "$firstnum$operator$secondnum 结果是: $(($firstnum$operator$secondnum))"
-
-
脚本开发案例2,检查网站服务是否能正常访问
###eg2检查网站服务是否能正常访问 [root@localhost tmp]# cat checked.sh #!/bin/bash # CheckUrl() { #相当于计数器 timeout=5 fails=0 success=0 #循环检测 ,循环执行命令 while true ###死循环 do sleep 1 ##睡眠1秒 # --tries 冲连机制, -q静默输出,-O /dev/null 结果写入黑洞文件 wget --timeout=${timeout} --tries=1 http://baidu.com -q -O /dev/null #echo $? #if 条件 -ne 是不等于的意思 if [ $? -ne 0 ] then let fails=fails+1 #失败次数+1 else let success=success+1 fi #判断当成功次数大于等于1的时候,就可以的出网站正常访问 if [ $success -ge 1 ] then echo "恭喜,网站正常运行" #返回一个状态玛, 0 exit 0 fi ##当错误次数大于2的时候,就告警;或法邮件 if [ ${fails} -ge 2 ] ; then #可自行扩展,发邮件,或短信的代码 echo "该网站一定三挂了,或在网络有问题" exit 2 #返回一个错误代码 fi done } #注意函数定义后,一定要调用执行 CheckUrl [root@localhost tmp]# sh checked.sh 恭喜,网站正常运行 [root@localhost tmp]# sh checked.sh ###断网后测试脚本 该网站一定三挂了,或在网络有问题
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器