Shell默认不支持浮点数,所以计算结果中的浮点数会被圆整为整数,如:1.23>11.99>1

在普通的算术运算中,运算符通常有+-*/等,但在shell语言中,所有数据都是以字符的方式存放的,故普通的运算符就不起作用了,如进行以下操作:

 

[root@localhost ~]# A=3
[root@localhost ~]# B=6
[root@localhost ~]# C=$A+$B
[root@localhost ~]# echo $C


———————————————执行结果——————————————

3+6


 

    可以看到执行结果是一个字符串的拼接,而非运算结果。

那么要在shell脚本中要完成算术运算,就需要引入一些特殊命令来辅助实现:

 

1. $[expression]

使用中括号将要进行运算的表达式括起来:

[root@localhost ~]# A=3
[root@localhost ~]# B=6
[root@localhost ~]# C=$[$A+$B]
[root@localhost ~]# echo $C


———————————————执行结果——————————————

9


 

2. $((expression))

使用两个小括号将要进行运算的表达式括起来:

[root@localhost ~]# D=$(($A+$B))
[root@localhost ~]# echo D


———————————————执行结果——————————————

D


 

3. let expression

let 命令是Linux的内键命令,故可使用help let 命令来查看其使用方法,它的作用为进行算术运算:

[root@localhost ~]# let E=$A+$B
[root@localhost ~]# echo $E


———————————————执行结果——————————————

9


 

4. expr expression

expr是个外键命令,因此可以使用man expr来查看帮助文档。在使用expr命令来进行算术运算时,需要使用命令替换,即使用反引号``将要运算的表达式包含进来,同时算术运算符前后都必须有空格:

[root@localhost ~]# F=` expr $A + $B`
[root@localhost ~]# echo $F


———————————————执行结果——————————————

9


        #运算符前后都有空格时,按照算术表达式运算


[root@localhost ~]# F=`expr $A+$B`
[root@localhost ~]# echo $F


———————————————执行结果——————————————

3+6

   #运算符前后都没有空格时,则将运算表达式当做字符串输出

 

 

下面来举几个例子来演示算术运算的操作:

1. 写一个脚本,随意声明两个变量,并给出整数值,而后计算其加、减、乘、除的结果:

 

# nano cal.sh

 

#!/bin/bash
Num1=16
Num2=4
 
echo "$Num1+$Num2=$[$Num1+$Num2]"
echo "$Num1-$Num2=$[$Num1-$Num2]"
echo "$Num1*$Num2=$[$Num1*$Num2]"
echo "$Num1/$Num2=$[$Num1/$Num2]"
 
# chmod +x cal.sh
# ./cal.sh

———————————————执行结果——————————————

16+4=20
16-4=12
16*4=64
16/4=4

 

2. 写一个脚本,来统计 /var目录下的文件个数

# nano countFiles.sh

#!/bin/bash
#
Count=0
 
for File in /var/*; do
        file $File
        Count=$[$Count+1]    
# 每循环一次,变量Count加1
done
 
echo "Total files: $Count"
[root@localhost ~]# chmod +x countFiles.sh
[root@localhost ~]# ./countFiles.sh


———————————————执行结果——————————————

/var/account: directory
/var/cache: directory
/var/crash: directory
/var/cvs: directory
/var/db: directory
/var/empty: directory
/var/games: directory
/var/gdm: sticky directory
/var/lib: directory
/var/local: directory
/var/lock: directory
/var/log: directory
/var/mail: symbolic link to `spool/mail'
/var/nis: directory
/var/opt: directory
/var/preserve: directory
/var/run: directory
/var/spool: directory
/var/tmp: sticky directory
/var/www: directory
/var/yp: directory
Total files: 21

 

3. 写一个脚本,来计算100以内所有整数的和

# nano sum.sh

#!/bin/bash
#
Sum=0
for I in {1..100}; do
        Sum=$[$Sum+$I]
done
echo "The sum is: $Sum."

 

[root@localhost ~]# chmod +x sum.sh
[root@localhost ~]# ./sum.sh


———————————————执行结果——————————————

The sum is: 5050.

 

4. 写一个脚本,计算100以内所有偶数的和;所有奇数的和:

# nano OddEven.sh

#!/bin/bash
 
EvenSum=0
OddSum=0
 
for I in `seq 1 2 100`; do
        OddSum=$[$OddSum+$I]
done
 
for I in `seq 0 2 100`; do
        EvenSum=$[$EvenSum+$I]
done
 
echo "Even Sum is $EvenSum; Odd Sum is $OddSum."

 

[root@localhost ~]# chmod +x OddEven.sh 
[root@localhost ~]# ./OddEven.sh


———————————————执行结果——————————————

Even Sum is 2550; Odd Sum is 2500.

 

5. 写一个脚本,计算本机上所有用户的ID号之和

# nano idSum.sh

 

#!/bin/bash
 
IDSum=0
 
for I in `cut -d: -f3 /etc/passwd`; do
        IDSum=$[$IDSum+$I]
done
 
echo "ID sum is: $IDSum."

 

[root@localhost ~]# chmod +x idSum.sh 
[root@localhost ~]# ./idSum.sh


 

———————————————执行结果——————————————

ID sum is: 113883.

 

6. 计算从197000分到此刻的天数

[root@localhost ~]# date +%s
1399941769    #从1970年0时0分到此刻的秒数
[root@localhost ~]# DAYS=$[` date +%s`/24/60/60]
[root@localhost ~]# echo $DAYS


———————————————执行结果——————————————

16203