双小括号“ ( ( ) ) ”的作用是进行数值运算与数值比较,它的效率最高,用法灵活,是经常被采用的运算操作符,其操作方法如下:
执行echo$((a++))和echo$((a--))命令输出整个表达式时,输出的值即为a的值,表达式执行完毕后,会对a进行++、--的运算,而执行echo$((++a))和echo$((--a))命令输出整个表达式时,会先对a进行++、--的运算,然后再输出表达式的值,即为a运算后的值。
注意:有关++、--运算的记忆方法:
- 变量a在运算符之前,输出表达式的值为a,然后a自增或自减;变量a在运算符之后,输出表达式会先自增或自减,表达式的值就是自增或自减后a的值。
- “(())”表达式在命令行执行时不需要加$符号,直接使用((6%2))形式即可,但是如果需要输出,就要加$符,例如:echo$((6%2))。
- “(())”里的所有字符之间没有空格、有一个或多个空格都不会影响结果。
使用举例:
[root@localhost ~]# echo $(( 6+2 )) #加法
8
[root@localhost ~]# echo $(( 6-2 )) #减法
4
[root@localhost ~]# echo $(( 6*2 )) #乘法
12
[root@localhost ~]# echo $(( 6/2 )) #除法
3
[root@localhost ~]# echo $(( 6%2 )) #取余
0
[root@localhost ~]# echo $(( 6**2 )) #求平方
36
[root@localhost ~]# a=3 #给变量赋值
[root@localhost ~]# echo $(( a++ )) #先输出变量值,再+1
3
[root@localhost ~]# echo ${a} #再查看变量,发现+1了
4
[root@localhost ~]# echo $(( a-- )) #先输出变量值,再-1
4
[root@localhost ~]# echo ${a} #再查看变量,发现-1了
3
[root@localhost ~]# echo $(( ++a )) #先+1,再输出变量值,输出的是+1后的值
4
[root@localhost ~]# echo ${a} #确认变量值
4
[root@localhost ~]# echo $(( --a )) #先-1,再输出变量值
3
[root@localhost ~]# echo ${a} #查看确认
3
let赋值表达式的功能等同于“((赋值表达式))”
使用举例:
[root@localhost ~]# i=1
[root@localhost ~]# echo $i
1
[root@localhost ~]# let i=i+8 #加8
[root@localhost ~]# echo $i #输出
9
[root@localhost ~]# let i=i-1 #i-1
[root@localhost ~]# echo $i #输出
8
[root@localhost ~]# let i++ #我在shell script中常使用这种方法,默认+1
[root@localhost ~]# echo $i
9
[root@localhost ~]# let i-- #i-1
[root@localhost ~]# echo $i
8
作用:
expr(evaluate(求值)expressions(表达式))命令既可以用于整数运算,也可以用于相关字符串长度、匹配等的运算处理。
(1)expr用于计算:
[root@localhost ~]# expr 2 + 3
5
[root@localhost ~]# expr 2 \* 3 #*号需要转义后使用
6
[root@localhost ~]# expr 6 / 3
2
[root@localhost ~]# expr 7 % 3
1
在使用expr时需要注意:
- 运算符及用于计算的数字左右都至少有一个空格,否则会报错。
- 使用乘号时,必须用反斜杠将其进行转义(转为普通字符),因为Shell可能会误解星号的含义。
(2)expr配合变量计算
[root@localhost ~]# i=5
[root@localhost ~]# i=`expr ${i} + 5` #需要使用反撇号将其括起来,注意变量和数字符号两边要有空格
[root@localhost ~]# echo ${i}
10
(3)判断一个变量值或字符串是否为整数
实现原理是,利用以expr做计算时变量或字符串必须是整数的规则,把一个变量或字符串和一个已知的整数(非0)相加,看命令返回的值是否为0。如果为0,就认为做加法的变量或字符串为整数,否则就不是整数。
示例1:
[root@localhost ~]# a=2
[root@localhost ~]# expr ${a} + 5
7
[root@localhost ~]# echo $? #输出为0,说明变量a是一个整数
0
[root@localhost ~]# b=lvjianzhao #定义一个字符变量
[root@localhost ~]# expr ${b} + 5 #实际上会直接报错
expr: 非整数参数
[root@localhost ~]# echo $? #输出为非0,则表示变量b不是一个整数
2
示例2:
[root@localhost ~]# vim test.sh
#!/bin/bash
expr $1 + 4 &> /dev/null
if [ $? -eq 0 ]
then
echo int
else
echo chars
fi
[root@localhost ~]# sh test.sh aaa
chars #输出的结果是字符串
[root@localhost ~]# sh test.sh 34
int #输出的结果是整数型
示例3:
#!/bin/bash
tuichu(){
exit 0
}
while true
do
read -p "pls input:" a
expr $a + 0 > /dev/null 2>&1
[ $? -eq 0 ] && echo int || echo chars
if [ $a == exit ]
then
tuichu #调用开头定义的函数
fi
done
[root@localhost ~]# sh test.sh #执行脚本
pls input:22 #输入数字进行测试
int
pls input:dfdf #输入字符进行测试
chars
pls input:exit #输入exit,将触发函数,而退出脚本,若不定义这个函数,只能通过ctrl+c强制中断脚本执行
chars
[root@localhost ~]#
(1)直接在命令模式下输入bc,按下回车后即可直接使用,如下:
[root@localhost ~]# bc #输入bc进入计算机环境
bc 1.06.95
........................#省略部分内容
1+8 #输入后按回车即可得到结果
9
9/3
3
6*2
12
(2)将bc用在命令行下面,以实现运算功能:
[root@localhost ~]# echo 3+4 | bc #通过echo命令结合管道符输出到bc计算机
7
[root@localhost ~]# echo "3.4+5.6" | bc
9.0
[root@localhost ~]# echo "3.2-2.5" | bc
.7
[root@localhost ~]# echo "scale=2;355/113" | bc #使用scale参数可以设置保留的小数位
3.14
[root@localhost ~]# echo "scale=6;355/113" | bc
3.141592
(3)利用bc配合变量运算:
[root@localhost ~]# i=5
[root@localhost ~]# i=`echo $i+6|bc` 利用echo输出,通过管道符交给bc,此方法效率较低,一般不使用。
[root@localhost ~]# echo $i
11
提示:根据bc所具有的特殊性来看,如果是小数,则选择bc运算没有问题(更推荐使用awk);若是整数场景,可用“( ( ) )”、let、expr等。
(4)使用一条命令计算输出1+2+3....+10的表达式,并计算结果(使用bc计算机实现)
生成1+2+3....+10表达式的方法有:
[root@localhost ~]# seq -s "+" 10 #seq是生成数字序列,-s是指定数字序列之间的分隔符
1+2+3+4+5+6+7+8+9+10
[root@localhost ~]# echo {1..10} | tr " " "+" #生成以空格为间隔的数字序列,并交给tr将空格替换为+号
1+2+3+4+5+6+7+8+9+10
实现上面需求的多种方法如下:
#使用bc计算
[root@localhost ~]# echo `seq -s "+" 10`=`seq -s "+" 10 | bc`
1+2+3+4+5+6+7+8+9+10=55
#使用(())计算
[root@localhost ~]# echo `seq -s "+" 10`=$((`seq -s "+" 10`))
1+2+3+4+5+6+7+8+9+10=55
#使用expr计算
[root@localhost ~]# echo `seq -s ‘+‘ 10`=`seq -s " + " 10|xargs expr`
1+2+3+4+5+6+7+8+9+10=55
使用$[ ] 来计算
[root@localhost ~]# echo `seq -s ‘+‘ 10`=$(echo $[ `seq -s ‘+‘ 10` ])
1+2+3+4+5+6+7+8+9+10=55
利用awk进行运算的效果也很好,适合小数和整数,特别是命令行计算,尤其是小数,运算很精准,好用。
使用举例:
[root@localhost ~]# echo "7.7 8.5" |awk ‘{print ($1-$2)}‘
-0.8
[root@localhost ~]# echo "7.7 3.5" |awk ‘{print ($1-$2)}‘
4.2
[root@localhost ~]# echo "358 114" | awk ‘{print ($1-2)/$2}‘
3.12281
[root@localhost ~]# echo "3 8" | awk ‘{print ($1+3)*$2}‘
48
需要使用typeset定义整数变量,直接进行计算,这个方法不常用,因为需要定义才能生效。
使用范例:
[root@localhost ~]# declare -i A=20 B=3 #-i参数可以将变量定义为整型
[root@localhost ~]# A=A+B #因为已声明是整型,因此可以直接进行运算了。
[root@localhost ~]# echo $A #输出查看
23
格式基本如下(至于运算符,则和其他的运算工具一样):
[root@localhost ~]# i=4
[root@localhost ~]# i=$[i+3]
[root@localhost ~]# echo ${i}
7
[root@localhost ~]# echo $[2*3]
6
[root@localhost ~]# echo $[9/3]
3
[root@localhost ~]# echo $[10%3]
1
[root@localhost ~]# echo $[1%3]
1
[root@localhost ~]# echo $[3/2]
1
———————— 本文至此结束,感谢阅读 ————————
原文:https://blog.51cto.com/14154700/2434448