Shell默认不支持浮点数,所以计算结果中的浮点数会被圆整为整数,如:1.23—>1;1.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. 计算从1970年0时0分到此刻的天数
[root@localhost ~]# date +%s 1399941769 #从1970年0时0分到此刻的秒数 [root@localhost ~]# DAYS=$[` date +%s`/24/60/60] [root@localhost ~]# echo $DAYS
———————————————执行结果——————————————
16203
转载于:https://blog.51cto.com/wuyelan/1424429