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