天天看點

bash shell的數值計算

1. 資料計算基礎

使用man 或者info檢視shell bash的判斷指令test,Shell中的 test 指令用于檢查某個條件是否成立,它可以進行數值、字元和檔案三個方面的測試。

man test info test      

可以使用type檢視一個指令是否是shell内置的函數,例如

$ type typetype is a shell builti

$ type awk
awk is /usr/bin/awk      

從結果可知: let 是 Shell 内置指令,awk是外部指令,在 /usr/bin 目錄下

expr指令是一個手工指令行計數器,用于在UNIX/LINUX下求表達式變量的值,一般用于整數值,也可用于字元串。

$ expr 5 % 21      

bc 指令是任意精度電腦語言,通常在linux下當電腦用。它類似基本的電腦, 使用這個電腦可以做基本的數學運算。

$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
3^2
9      

let 指令是 BASH 中用于計算的工具,用于執行一個或多個表達式,變量計算中不需要加上 $ 來表示變量。如果表達式中包含了空格或其他特殊字元,則必須引起來。

$ let a=1+1; echo $a2      

2. 求模求幂

$ expr 5 % 2
1

$ let i=5%2
$ echo $i1

$ echo 5 % 2 | bc
1

$ ((i=5%2))
$ echo $i1

$ let i=5**2
$ echo $i25

$ ((i=5**2))
$ echo $i25
$ echo "5^2" | bc
25      

3. 浮點數計算

let 和 expr 都無法進行浮點運算,但是 bc 和 awk 可以。

$ echo "scale=3; 1/13"  | bc
.076

$ echo "1 13" | awk '{printf("%0.3f\n",$1/$2)}'0.077      

bc 在進行浮點運算時需指定精度,否則預設為 0,即進行浮點運算時,預設結果隻保留整數。而 awk 在控制小數位數時非常靈活,僅僅通過 printf 的格式控制就可以實作。

4. 擷取随機數

環境變量 RANDOM 産生從 0 到 32767 的随機數,而 awk 的 rand() 函數可以産生 0 到 1 之間的随機數。

$ echo $RANDOM81

$ echo "" | awk '{srand(); printf("%f", rand());}'0.237788      
$ expr $RANDOM / 128
208

$ echo "" | awk '{srand(); printf("%d\n", rand()*255);}'104      

5. 擷取一系列數

$ for i in {1..12}; do echo -n "$i "; done1 2 3 4 5 6 7 8 9 10 11 12 %      

繼續閱讀