1. 程式人生 > >[ SHELL編程 ] shell編程中數值計算方法實例

[ SHELL編程 ] shell編程中數值計算方法實例

最長 否則 style += int 完整 精度 font pan

SHELL編程中經常會涉及到數值的相關計算,有時候對於這些計算命令的時候場景容易忘記或者混淆,這裏針對常用的計算做一個總結。主要包括let、bc、expr、(())等。

1、let

使用格式:let 表達式,表達式必須是完整的表達式,即等號兩邊。只能賦值,不支持浮點數運算,不支持直接輸出

$ var=10
$ let var+=2 #var=12,中間不能有空格
$ let var=var+2 #var=14
$ let var*=2 #var=28
$ let var/=2 # var=14

無法計算浮點數,報錯

$ var=2.5
$ let var+=1
-bash: let: 2.5: 語法錯誤: 無效的算術運算符 (錯誤符號是 ".5")

2、bc

常用,支持浮點數運算

echo "1+1" | bc # 2
echo "1.5+1.5" | bc # 3.0
echo "3-1.2" | bc #1.8
echo "1.5*1.5" | bc #2.2
echo "10/3" | bc # 3
echo "scale=2;10/3" | bc #3.33

看到乘數和除數的精度不同了嗎?設置其他參數測試下

echo "1.5*1.33333" | bc #1.99999
echo "1.5111111111111111111111*1.33333" | bc #2.0148097777777777777777
echo "4/5"
| bc #0 echo "1/2" | bc #0 echo "6/5" | bc # 1

乘法輸出結果的精度和相乘數最長的進度保持一致。整數相除結果下取整。當然,它是可以賦值的

var=$(echo "1+1"|bc) #var=2

3、expr

不支持浮點數運算,註意數字與計算符中的空格

expr 1 + 1 #2
expr 1 - 1 #0
expr 1 \* 1 #1,註意*號前面有\,否則報錯
expr 1 / 1 #1
expr 1+1 #1+1,與預期不符
expr 1.0 + 1 #輸出語法錯誤
var=$(expr 1 + 1) #var=2
var2=$(expr ${var} + 2
) #var2=4

4、$(())

不支持浮點數運算,不支持窗口直接執行$(()),

var=$((1+1)) #1+1運算符前後中間是否有空格不影響計算
v1=10
v2=15
var=$((v1+v2))
var=$(($v1+$v2))
a=$(( 1 + 1.0 )) #提示語法錯誤

可以發現,在$(())中的變量帶不帶$取值符號都不影響計算。

5、awk

awk結合print的使用可以很好的各種完成數值計算,包括浮點數及精度控制。

$ awk BEGIN{printf 1.0/2.0}‘ #0.5
$ awk BEGIN{printf "5.2f%",10/3}‘ #3.33
$ var1=10
$ var2=3
$ awk -v v1=${var1} -v v2=${var2} BEGIN{printf "%5.2f\n",v1/v2} #3.33

最後來看個實例,輸出1~5的數值

#!/bin/bash

i=1
MAX=5
while [ ${i} -lt ${MAX} ];do
  printf "${i}\n"
  i=$(($i+1))
done

輸出結果

1
2
3
4

[ SHELL編程 ] shell編程中數值計算方法實例