五、数学运算符

expr命令

对数字的基本计算做比较时,假为0,真为1,特殊符号需要转义。

只支持整数运算

注意要有空格

 image

使用expr命令时需要加\进行转义,因为部分符号是保留关键字

image

例:对数字的基本计算

[root@tzPC ~]# expr 2\>5
2>5
[root@tzPC ~]# expr 2 \> 5
0
[root@tzPC ~]# expr 6 \> 5
1
[root@tzPC ~]# expr 3 \* 5
15
[root@tzPC ~]# expr 1 + 1
2

例:对字符串的运算

[root@tzPC ~]# expr length "ni hao"
6
[root@tzPC ~]# expr substr "ni hao" 2 4  #从第2个字符取4个
i ha

例:比较num1跟num2的大小

[root@localhost ~]# num1=30
[root@localhost ~]# num2=50
[root@localhost ~]# expr $num1 \> $num2
0
[root@localhost ~]# num3=`expr $num1 \> $num2`

 例:脚本中使用

[root@tzPC Script]# bash test2
The result is 0
[root@tzPC Script]# cat test2
#!/bin/bash
a=1
b=2
c=$(expr $a / $b)
echo The result is $c

 

使用方括号

使用方括号不需要转义

[root@tzPC Script]# bash test3
The final result is 500
[root@tzPC Script]# cat test3
#!/bin/bash
var1=100
var2=50
var3=45
var4=$[$var1 * ($var2 - $var3)]
echo The final result is $var4

 

使用$(())

格式:$((表达式1,表达2))

特点:

1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等。a++  等价于 a=a+1

2、在双括号结构中,所有变量可以不加入:“$”符号前缀。

3、双括号可以进行逻辑运算,四则运算

4、双括号结构 扩展了for,while,if条件测试运算

5、支持多个表达式运算,各个表达式之间用“,”分开

常用的算数运算符

运算符

   意义

++   --

递增及递减,可前置也可以后置

+  -  ! ~

一元运算的正负号 逻辑与取反

+  -  *  /   %

加减乘除与余数

<   <=   >   >=

比较大小符号

==   !=

相等 不相等

>>  <<

向左位移 向右位移

& ^   |

位的与 位的异或 位的或

&&  ||

逻辑与 逻辑或

? :

条件判断

例:

[root@tzPC ~]# ((a=1+2*3-2))
[root@tzPC ~]# echo $a
5
[root@tzPC ~]# b=$((1+2))
[root@tzPC ~]# echo $b
3
[root@tzPC ~]# echo $((2*3))
6

例:递增递减

[root@tzPC ~]# echo $b
3
[root@tzPC ~]# echo $((b++))
3
[root@tzPC ~]# echo $b
4

 说明: a++或a--为先赋值再+1或减1    ++a或--a为先加1或减1,然后再进行赋值

例:求1到100的和

[root@tzPC ~]# echo $((100*(1+100)/2))
5050

练习题

要求:提示用户输入一个正整数num,计算1+2+3+…+num的值。

需要判断是否为整数

[root@localhost ~]# num1=56.1
[root@localhost ~]# expr $num1 + 1
expr: 非整数参数
[root@localhost ~]# echo $?
2
#可以看到报错,输出结果为2
[root@localhost ~]# num1=56
[root@localhost ~]# expr $num1 + 1
57
[root@localhost ~]# echo $?
0
#输出结果为0表示执行成功

答案

[root@localhost ShellScript]# cat example_4.sh
#!/bin/bash
while true
do
read -p "pls input a positive number:" num
expr $num + 1 &> /dev/null
if [ $? -eq 0 ];then
        if [ `expr $num \> 0` -eq 1 ];then
                for((i=1;i<=$num;i++))
                do
                        sum=`expr $sum + $i`
                done
                echo "1+2+3+...+$num=$sum"
                exit
        fi
fi
echo "error,input enlegal"
done
答案

 

浮点运算bc命令

bc是bash自带的运算器,支持浮点数运算,变量,注释(/* */),表达式,编程语句,函数。

如果不指定内建变量scale,默认还是得到的整数

自带变量scale可以设置,默认为0,也就是为整型

支持+,-,*,/,%,^运算

num1 + num2
num1 - num2
num1 * num2
num1 / num2
num1 % num2
num1 ^ num2  //指数运算

输入bc回车进入互动模式

[root@localhost ShellScript]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
5+5
10
5/3
1
scale=2  //保留小数点后两位
23/5
4.60

或者

[root@localhost ShellScript]# echo "12+45" | bc
57

通过scale设置精确度

[root@localhost ShellScript]# echo "scale=4;12.56*45.88" | bc
576.2528

在脚本中使用bc

[root@tzPC Script]# bash test4
The answer is .6880
[root@tzPC Script]# cat test4
#!/bin/bash
var1=$(echo "scale=4; 3.44 / 5" | bc)
echo The answer is $var1

 

bc可以识别内联输入

[root@tzPC Script]# bash test6
The final answer for this mess is 1578.184
[root@tzPC Script]# cat test6
#!/bin/bash
var1=10.4
var2=43.21
var3=33.2
var4=34
var5=$(bc << EOF
scale =4
a1 = ( $var1 * $var2)
b1 = ( $var3 * $var4)
a1+b1
EOF
)
echo The final answer for this mess is $var5

 

在bash计算器中创建的变量只能在bash计算器中使用,不能在脚本中使用

简易到爆的乘法计算器

[root@localhost ShellScript]# cat bc.sh
#!/bin/bash

read -p "num1:" num1
read -p "num2:" num2
echo "scale=4;$num1*$num2" | bc
或者
num3=`echo "scale=4;$num1*$num2" | bc`
echo $num3

退出脚本exit

 Shell中每个命令都使用退出状态码来高速shell已经运行完毕,退出状态码取值范围0~255的证书。

一个成功结束的命令的退出状态码是0。

root@tzPC Script]# echo $?
0
[root@tzPC Script]# sdfasdf
bash: sdfasdf: 未找到命令
[root@tzPC Script]# echo $?
127
状态码 描述
0 命令成功结束
1

一般性未知错误(提供了无效参数)

2 不适合的shell命令
126 命令不可执行(没有执行权限)
127 没有找到命令
128 无效的退出参数
128+x 与Linux信号x相关的严重错误
130 通过Ctrl+C终止的命令
255 正常范围之外的退出状态码

 退出状态码可以指定,也可以为变量

[root@tzPC Script]# cat test3
#!/bin/bash
var1=100
var2=50
var3=45
var4=$[$var1 * ($var2 - $var3)]
echo The final result is $var4
exit 5 #或者为 exit $var4

如果退出码大于255,结果就会变为指定的数值除以256得到的余数。

 

posted @ 2020-07-15 17:02  努力吧阿团  阅读(375)  评论(0编辑  收藏  举报