首页 > 技术文章 > shell 数学运算

mianbaoshu 2020-12-03 15:40 原文

shell运算符如下:

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

Shell编程之算术运算命令

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

1. 双小括号(()) 数值运算命令

双小括号的作用是进行数值运算与数值的比较,它的效率很高,用法很灵活,是企业运维人员经常采用的操作符
((e=e+1)) 它的作用就是把e+1的结果赋值给变量e,可以使用echo $((e=e+1)) 或者 e=$((e=e+1))  把e+1的执行结果赋值给变量e

数值比较  ((8>7&&5==5)) 用于条件判断

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

[root@shell-yankerp sh]# echo $((1+1)) #计算1+1后输出 
2  #那么结果就是等于2
[root@shell-yankerp sh]# echo $((6-3)) #计算6-3等于多少 
3  #结果为3
[root@shell-yankerp sh]# ((a=1+2**3-4%3)) #将=后面的一些计算的结果会赋值给a这个变量
[root@shell-yankerp sh]# echo $a
8  #结果为3
[root@shell-yankerp sh]# b=$((1+2**3-4%3)) #在这里b是一个变量 将变量名的计算结果赋值给b 
[root@shell-yankerp sh]# echo $b     #输出如下:
8
[root@shell-yankerp sh]#
[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]# 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]# a=10
[root@shell-yankerp sh]# echo $((a++)) 
10
[root@shell-yankerp sh]# echo $a
11
[root@shell-yankerp sh]#
[root@shell-yankerp sh]# a=11
[root@shell-yankerp sh]# echo $((a--)) 
11
[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)) 
10

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

#!/bin/bash
a=6
b=3
echo "a-b=$((a-b))"
echo "a+b=$((a+b))"
echo "a/b=$((a/b))"
echo "a**b=$((a**b))"

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
let与(())的对比
[root@shell-yankerp ~]# a=2
[root@shell-yankerp ~]# echo $((a=a+8)) 
10
[root@shell-yankerp ~]# echo $a
10

expr命令用法实例:

在用expr命令时 左右两侧必须要空格,选择用*号需要拿\转义
利用expr做计算,将一个未知的变量和一个已知的一个整数相加,看返回的值是否为0,如果默认是0 那么就是一个整数。如果非0则输入的就是字符串不是整数。
[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配合变量实例
[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]#
判断变量是否为整数
#!/bin/bash
expr $1 + 1 &>/dev/null  #这里是一个命令 使用了expr 也使用了特殊的位置变量 
if [ "$?" -eq 0 ]     #如果以上命令执行结果为0 
 then      #那么
  echo "输入的是整数~"  #输出一条 输入的是整数
 else   #否则
  echo "/bin/sh $# 请输入一个整数"   这里也使用了特殊的位置变量
fi

实战:第一关判断参数个数是否为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))"

BC命令的用法

bc是UNIX&Linux下的计算器,因此输了可以做计算器使用,还可以作为命令行计算工具使用,bc可以处理整数和小数,如下:
1.做计算器使用
ubuser@ubuser-OptiPlex-7010:~$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1+1
2
3*6
18
2.5+3.7
6.2
使用ctrl+D可以退出
2.命令行使用
[root@shell-yankerp ~]# echo 1+2 | bc
3
[root@shell-yankerp ~]# echo 1.5+1.5 | bc 
3.0
[root@shell-yankerp ~]# echo 2*2 | bc
4
[root@shell-yankerp ~]# echo 8.5-8.5 | bc 
0
[root@shell-yankerp ~]#
利用BC配置变量运算
[root@shell-yankerp ~]# i=5  #设置变量 i=5 
[root@shell-yankerp ~]# i=`echo $i+5 | bc` 
[root@shell-yankerp ~]# echo $i 
10
[root@shell-yankerp ~]#

使用awk实现计算

利用awk进行计算的效果很好,尤其是处理小数,很精确如下:
ubuser@ubuser-OptiPlex-7010:~$ echo "7.1 3.23"|awk '{print $1-$2}'
3.87
ubuser@ubuser-OptiPlex-7010:~$ echo "4 5"|awk '{print ($1+4)*$2}'
40
ubuser@ubuser-OptiPlex-7010:~$

$[]运算

[root@shell-yankerp ~]# a=5
[root@shell-yankerp ~]# a=$[a+10]
[root@shell-yankerp ~]# echo $a
15
[root@shell-yankerp ~]# echo $[2*3] 
6
[root@shell-yankerp ~]# echo $[2/3] 
0
[root@shell-yankerp ~]#

基于Shell变量输入read命令的运算

Shell变量除了可以直接赋值或者脚本传参外,还可以使用read命令从标准输入中获取,read命令为bash的内置命令。
用法如下:
-p 设置提示信息
-t 设置输入的等待时间 
ubuser@ubuser-OptiPlex-7010:~$ read -t10 -p "please input:" o p
please input:3 4
ubuser@ubuser-OptiPlex-7010:~$
ubuser@ubuser-OptiPlex-7010:~$ echo $o $p
3 4
#!/bin/bash
read -t 10 -p "请输入任意两个数值:" a b
expr $a + 1 &>/dev/null
if [ "$?" -ne "0" ]
 then
  echo /bin/bash..$0 "请输入两个数字"
  exit 1
fi
[ ${#a} -le 0 ] && {
 echo "不能为空!!!"
 exit 1
}
[ ${#b} -le 0 ] && {
 echo "不能为空!!!"
 exit 1
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))"
read -t 10 -p "请输入任意两个数值:" a b 等待用户输入内容,等待时间为10秒,后面的a b是变量,那么当用户输入了两个数值比如说 1 2 那么1就赋值给了a 2就赋值给了b
expr $a + 1 &>/dev/null 这个其实前面的文章说过了 使用expr来判断用户输入的是数值还是字符串
if [ "$?" -ne "0" ]   如果以上命令输入的内容不等于0 也就是输入的不是数值
  then         那么
    echo /bin/bash..$0 "请输入两个数字"    #输出一条请输入数字并打印当前脚本名称
    exit 1                退出脚本
fi
[ ${#a} -le 0 ] && {       这里使用了判断,我们已经知道a是一个变量了 如果a长度小于0判断用户是否输入的是空格
  echo "不能为空!!!"   如果输入的是空格那么就输出一条 不能为空
  exit 1    #退出脚本
}
 
来自: https://www.jb51.net/article/134292.htm
https://www.jb51.net/article/134293.htm

推荐阅读