温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

shell变量的数值计算详解

发布时间:2020-07-14 16:15:43 来源:网络 阅读:202 作者:筱振 栏目:系统运维

如果要执行算术运算,就会离不开各种运算符号,和其他编程语言类似,Shell也有很多算术运算符。

常见的运算符号,如图:
shell变量的数值计算详解
常见的运算命令,如图:
shell变量的数值计算详解
下面详细介绍一下,各种运算命令的详细用法:

一、双小括号“(())”数值运算命令

双小括号“(())”的作用是进行数值运算与数值比较,它的效率很高,用法灵活,是企业场景中运维人员经常采用的运算操作符,具体操作语法,如图:
shell变量的数值计算详解
详细介绍其使用方法:

进行简单的运算,如下:

[root@localhost ~]# echo $((1+1))
2
//计算1+1的结果再输入
[root@localhost ~]# ((i=5))
[root@localhost ~]# ((i=i*2))
[root@localhost ~]# echo $i
10
//首先定义i的值,其次进行运算,最后输出结果

稍微复杂一些的综合运算,如下:

[root@localhost ~]# ((a=1+2**3-4%3)) && echo $a
8
//“**”表示几次方的意思,“%”表示取余的意思
//计算顺序就是先乘除再加减,
//最后通过echo输出结果

特殊符号运算示例:

[root@localhost ~]# a=1
[root@localhost ~]# echo $((a=a+1))
2
//将“a+1”重新赋值给a,然后输出结果
[root@localhost ~]# echo $((a+=1))
3
//“+=”表示“a=a+1”,重新复制给a
[root@localhost ~]# echo $((a**2))
9
//“**”表示幂次方,现在a的值是3,平方当然是9

利用“(())”双括号进行比较及判断示例:

[root@localhost ~]# echo $((1<2))
1
//1表示结果的成立的,相反,0则表示结果不成立
[root@localhost ~]# echo $((2<1))
0

上面示例中所涉及到的数字及变量必须为整数,不能是小数点及字符串。

特殊符号“++”、“--”所表示的含义:

[root@localhost ~]# a=10
[root@localhost ~]# echo $((a++))
10
[root@localhost ~]# echo $a
11
[root@localhost ~]# echo $((a--))
11
[root@localhost ~]# echo $a
10
[root@localhost ~]# echo $((--a))
9
[root@localhost ~]# echo $a
9
[root@localhost ~]# echo $((++a))
10
[root@localhost ~]# echo $a
10

通过示例可以看出:执行echo$((a++))和echo$((a--))命令输出整个表达式时,输出的值即为a的值,表达式执行完毕后,会对a进行++、--的运算,而执行echo$((++a))和echo$((--a))命令输出整个表达式时,会先对a进行++、--的运算,然后再输出表达式的值,即为a运算后的值。

“(())”表达式在命令行执行时不需要加$符号,直接使用((6%2))形式即可,但是如果需要输出,就要加$符,例如:echo$((6%2))。
·“(())”里的所有字符之间没有空格、有一个或多个空格都不会影响结果。

shell脚本小示例:

简单的复杂运算的脚本

第一种,不太实用:

[root@bogon ~]# vim test.sh
#!/bin/bash
a=6
b=2
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))"
[root@bogon ~]# sh test.sh
6-2=4
6+2=8
6*2=12
6/2=3
6**2=36
6%2=0

第二种,实用:

[root@bogon ~]# vim test1.sh 
#!/bin/bash
echo "$1-$2=$(($1-$2))"
echo "$1+$2=$(($1+$2))"
echo "$1*$2=$(($1*$2))"
echo "$1/$2=$(($1/$2))"
echo "$1**$2=$(($1**$2))"
echo "$1%$2=$(($1%$2))"
[root@bogon ~]# sh test1.sh 10 2
10-2=8
10+2=12
10*2=20
10/2=5
10**2=100
10%2=0

使用read命令等待输入,

第一种方法:

[root@bogon ~]# vim test2.sh
#!/bin/bash
print_usage(){
#定义一个整数
        printf "Please enter an integer\n"
        #打印信息“请输入一个整数”
        exit 1
        #返回值为1,退出脚本
}
read -p "Please input first number:" A
#请输入第一个数字
if [ -n "`echo ${A}|sed 's/[0-9]//g'`" ]
#判断是否为整数,用0-9替换$A的值,进而判断是否为数字
then
        print_usage
        #如果上述变量值不为空,说明不是整数,则调用用户帮助函数
fi
read -p "Please input the operators:" B
#请输入操作符
if [ "${B}" != "+" ] && [ "${B}" != "-" ] && [ "${B}" != "*" ] && [ "${B}" != "/" ] && [ "${B}" != "%" ] && [ "${B}" != "**" ]
#判断输入的内容是否为+、-、*、/、%、**
then
        echo "Please use{+|-|*|/|%|**}"
        #如果操作符不符合要求,则给出提示
        exit 2
        #因为不符合要求,因此以返回值为2退出脚本,表示错误
fi
read -p "Please input second number: " C
#请输入第二个数字
if [ -n "`echo ${C}|sed 's/[0-9]//g'`" ]
#判断是否为整数,用0-9替换$C的值,进而判断是否为数字
then
        print_usage
        #如果上述变量值不为空,说明不是整数,则调用用户帮助函数
fi
echo "${A}${B}${C}=$((${A}${B}${C}))"
#最后输出结果
[root@bogon ~]# sh test2.sh
Please input first number:10
Please input the operators:/
Please input second number: 2
10/2=5

第二种:

[root@bogon ~]# vim test3.sh
#!/bin/bash
print_usage(){
    printf $"USAGE:$0 NUM1 {+|-|*|/} NUM2\n"
    #打印帮助信息
    exit 1
}
if [ $# -ne 3 ]
#如果脚本传入的参数个数不等于3个(因为要输入两个数字及一个运算符号)。
then
    print_usage
    #则调用用户帮助函数。
fi
A=$1
C=$3
B=$2
if [ -n "`echo ${A}|sed 's/[0-9]//g'`" ]
then
    print_usage
fi
if [ "${B}" != "+" ] && [ "${B}" != "-" ] && [ "${B}" != "*" ] && [ "${B}" != "/" ]
#判断第二个输入的操作符是否为+、-、*、/
then
    print_usage
fi
if [ -n "`echo ${C}|sed 's/[0-9]//g'`" ]
then
    print_usage
fi
echo "${A}${B}${C}=$((${A}${B}${C}))"
[root@bogon ~]# sh test3.sh 10 + 2
10+2=12
[root@bogon ~]# sh test3.sh 10 - 2
10-2=8
[root@bogon ~]# sh test3.sh 10 \* 2
10*2=20
[root@bogon ~]# sh test3.sh 10 / 2
10/2=5

最简单、高效的一种办法就是:

[root@bogon ~]# cat test4.sh
echo $(($1))
//利用两个双括号计算
[root@bogon ~]# sh test4.sh 5+5
10
[root@bogon ~]# sh test4.sh "5 + 5"
10
//如果带空格使用双引号

二、let运算命令用法

let赋值表达式的功能等同于“((赋值表达式))”
比如:

[root@bogon ~]# i=2
[root@bogon ~]# i=i+8
[root@bogon ~]# echo $i
i+8
//开头不用let,输出时并不会输出计算结果
[root@bogon ~]# unset i
[root@bogon ~]# i=2
[root@bogon ~]# let i=i+8
[root@bogon ~]# echo $i
10
//使用let开头,输出是则会输出计算结果
[root@bogon ~]# ((i=i+10))
[root@bogon ~]# echo $i
20

let i=i+8与((i=i+8))效果一样,推荐使用第二种!

三、expr命令的用法

expr命令既可以用于整数运算,也可用于相关字符串长度、匹配等的运算处理!

1.expr用于计算
[root@bogon ~]# expr 2 + 2
4
[root@bogon ~]# expr 2 - 2
0
[root@bogon ~]# expr 2 \* 2
4
//需要使用转义符“\”
[root@bogon ~]# expr 2 / 2
1

在使用expr命令时:

  • 运算符及用于就算的数字左右都至少有一个空格,否则会报错;
  • 使用星号时,必须使用转义符“\”,否则shell会错误的理解星号的作用;
2.expr配合变量进行计算

expr可配合变量进行计算,但需要用反引号将计算表达式括起来。比如:

[root@bogon ~]# i=5
[root@bogon ~]# i=`expr $i + 5`
//注意变量和数字两边要有空格
[root@bogon ~]# echo $i
10
3.判断一个变量值或字符串是否为整数

原理:利用以expr做计算时变量或字符串必须是整数的原则,把一个变量或字符串和一个已知的整数(非0)相加,看命令执行的结果是否为0。如果是0,就认为做加法的变量或字符串为整数;反之则不是。比如:

[root@bogon ~]# i=5
[root@bogon ~]# expr $i + 6 &>/dev/null
[root@bogon ~]# echo $?
0
[root@bogon ~]# i=a
[root@bogon ~]# expr $i + 6 &>/dev/null
[root@bogon ~]# echo $?
2

脚本示例:

第一种:

[root@bogon ~]# vim test.sh
#!/bin/bash
expr $1 + 1 &> /dev/null
if      [ $? -eq 0 ]
then
        echo int 
else
        echo chars
fi
[root@bogon ~]# sh -x test.sh 12
+ expr 12 + 1
+ '[' 0 -eq 0 ']'
+ echo int
int
[root@bogon ~]# sh -x test.sh qq
+ expr qq + 1
+ '[' 2 -eq 0 ']'
+ echo chars
chars

第二种

[root@bogon ~]# vim test1.sh
#!/bin/bash
while true
do
        read -p "Please input:" A
        expr $A + 1 &>/dev/null
        if      [ $? -eq 0 ]
        then
                echo int
        else
                echo chars
        fi
done
[root@bogon ~]# sh test1.sh
Please input:1
int
Please input:q
chars
//这样的脚本是永远等待输入,并判断;
//如果只希望判断一次就结束,把while循环语句删除即可!
4.通过expr计算字符串的长度
[root@bogon ~]# a=dfdfdfdfdfd
[root@bogon ~]# expr length "$a"
11
[root@bogon ~]# echo ${#a}
11
[root@bogon ~]# echo ${a} | wc -L
11
[root@bogon ~]# echo ${a} | awk '{print length($0)}'
11

四、bc命令的用法

bc是Linux下的计算机,除了可以作为计算机来使用,还可以作为命令工具来使用!

bc命令作为计算机使用:

[root@bogon ~]# 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'. 
1+2
3

bc命令在命令行进行计算:

[root@bogon ~]# echo 3+5 | bc
8
[root@bogon ~]#  echo "scale=2;355/113"|bc
3.14
//使用scale=2保留两位小数。

五、awk实现计算

利用awk进行运算的效果也很好,适合小数和整数,特别是命令行计算,尤其是小数,运算很精确,好用。比如:

[root@bogon ~]# echo "1.2 1.3" | awk '{print $1+$2}'
2.5
[root@bogon ~]# echo "10 10" | awk '{print ($1+10)/$2}'
2

六、$[]的使用方法

示例:

[root@bogon ~]# i=10
[root@bogon ~]# i=$[i+10] && echo $i
20
[root@bogon ~]# echo $[2*3]
6
[root@bogon ~]# echo $[2-3]
-1

这次就简单介绍这么多!

———————— 本文至此结束,感谢阅读 ————————

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI