huazhi 发表于 2018-8-22 13:24:36

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]
查看完整版本: 17_Shell语言———如何在shell 脚本中进行算术运算