17_Shell语言———如何在shell 脚本中进行算术运算
Shell默认不支持浮点数,所以计算结果中的浮点数会被圆整为整数,如:1.23—>1;1.99—>1。在普通的算术运算中,运算符通常有+,-,*,/等,但在shell语言中,所有数据都是以字符的方式存放的,故普通的运算符就不起作用了,如进行以下操作:
# A=3
# B=6
# C=$A+$B
# echo $C
———————————————执行结果——————————————
3+6 可以看到执行结果是一个字符串的拼接,而非运算结果。
那么要在shell脚本中要完成算术运算,就需要引入一些特殊命令来辅助实现:
1. $
使用中括号将要进行运算的表达式括起来:
# A=3
# B=6
# C=$[$A+$B]
# echo $C
———————————————执行结果——————————————
9 2. $((expression))
使用两个小括号将要进行运算的表达式括起来:
# D=$(($A+$B))
# echo D
———————————————执行结果——————————————
D 3. let expression
let 命令是Linux的内键命令,故可使用help let 命令来查看其使用方法,它的作用为进行算术运算:
# let E=$A+$B
# echo $E
———————————————执行结果——————————————
9 4. expr expression
expr是个外键命令,因此可以使用man expr来查看帮助文档。在使用expr命令来进行算术运算时,需要使用命令替换,即使用反引号``将要运算的表达式包含进来,同时算术运算符前后都必须有空格:
# F=` expr $A + $B`
# echo $F
———————————————执行结果——————————————
9 #运算符前后都有空格时,按照算术表达式运算
# F=`expr $A+$B`
# 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"
# chmod +x countFiles.sh
# ./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."
# chmod +x sum.sh
# ./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."
# chmod +x OddEven.sh
# ./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."
# chmod +x idSum.sh
# ./idSum.sh
———————————————执行结果——————————————
ID sum is: 113883. 例6. 计算从1970年0时0分到此刻的天数
# date +%s
1399941769 #从1970年0时0分到此刻的秒数
# DAYS=$[` date +%s`/24/60/60]
# echo $DAYS
———————————————执行结果——————————————
16203
页:
[1]