shell算術運算與進制運算


(())與let是等效的 arithmetic expression

type 與[是等效的

source與.是等效的

 

其實,Shell(這里是Bash)本身不具備處理浮點計算的能力,但是可以使用“bc”這個高精度的計算器工具來幫助,另外,也可以在Bash中調用“awk”腳本來處理浮點運算。

linux shell 不同進制數據轉換(二進制,八進制,十六進制,base64)

shell可以在不調用第3方命令,表示不同進制數據。這里總結以下表示方法。shell 腳本默認數值是由10 進制數處理,除非這個數字以某種特殊的標記法或前綴開頭. 才可以表示其它進制類型數值。如:
以 0 開頭就是 8 進制.以0x 開頭就是16 進制數.使用 BASE#NUMBER 這種形式可以表示其它進制.BASE值:2-64. 

adj
octal    八進制的
decimal    十進制的
hexadecimal  十六進制的
((表達式)),(())里面可以是任意數據表達式。如果前面加入:”$”可以讀取計算結果。 其它進制轉為10進制 [root@
250-shiyan prog]# ((num=2#0111011));echo $num 59 [root@250-shiyan prog]# ((num=0123));echo $num 83 [root@250-shiyan prog]# ((num=0x1e));echo $num 30 [root@250-shiyan prog]# ((num=8#123));echo $num 83 0-9a-f [root@250-shiyan prog]# ((num=16#56c));echo $num 1388 0-9a-zA-Z [root@250-shiyan prog]# ((num=64#Z));echo $num 61 [root@250-shiyan prog]# ((num=64#_));echo $num 63 10進制轉其它進制 這里使用到:bc外部命令完成。bc命令格式轉換為:echo "obase=進制;值"|bc [root@250-shiyan prog]# echo "obase=2;8"|bc 1000 [root@250-shiyan prog]# echo "obase=8;9"|bc 11 shell內置各種進制表示方法非常簡單。記得base#number 即可。這里記得賦值時候用(())符號。不能直接用=號了。=號沒有值類型。默認將后面變成字符串了。如: 0開頭已經失去了意義了。 可以通過定義符:let達到(()) 運算效果。 [root@250-shiyan prog]# num=0123;echo $num 0123 [root@250-shiyan prog]# let num=0123;echo $num 83

 

echo "$(echo 'scale=2;40*100/90' | bc)%"

[root@84-monitor newmonitor]# ssh 192.168.2.109 echo "`echo "scale=3;2*3/7"|bc`"

使用awk來處理浮點計算和浮點數比較
#!/bin/bash # author: Jay <smile665@gmail.com> # some examples for playing with floating point number. # basic usage of 'bc' tool in Bash. a=3.33 b=3.3 c=$(echo "$a + $b" | bc) d=$(echo "$a * $b" | bc) e=$(echo "scale=5; $a / $b" | bc) echo "c=a+b=$a+$b=$c" echo "d=a*b=$a*$b=$d" echo "e=a/b=$a/$b=$e" # "-l" parameter for 'bc' means using math library. pi=$(echo "scale=10; 4*a(1)" | bc -l) s=$(echo "s($pi/6)" | bc -l) echo "pi=$pi" echo "s=sin(pi/6)=$s" # use more options of 'bc' tool r=$(echo 'ibase=10;obase=2; 15+16' | bc) echo "binary of (15+16) is $r" # comparison for floating point numbers using 'bc' big=100 small=99.9 if [ $(echo "$big > $small" | bc) -eq 1 ]; then echo "$big is bigger than $small" fi # deal with floating point numbers with 'awk' language echo $(awk -v x=10 -v y=2.5 'BEGIN {printf "10/2.5=%.2f\n",x/y}') v=$(echo $big $small | awk '{ printf "%0.8f\n" ,$1/$2}') echo "$big / $small = $v" echo $big $small | awk '{if($1>$2) {printf"%f > %f\n",$1,$2} else {printf"%f <%f\n",$1,$2}}' master@jay-linux:~/workspace/mygit/shell/sh2012$ ./floating-point.sh c=a+b=3.33+3.3=6.63 d=a*b=3.33*3.3=10.98 e=a/b=3.33/3.3=1.00909 pi=3.1415926532 s=sin(pi/6)=.49999999994373819220 binary of (15+16) is 11111 100 is bigger than 99.9 10/2.5=4.00 100 / 99.9 = 1.00100100 100.000000 > 99.900000 master@jay-linux:~/workspace/mygit/shell/sh2012$ cat temp.bc 3+8 3/8 scale=2; 3/8 master@jay-linux:~/workspace/mygit/shell/sh2012$ bc -q temp.bc 11 0 .37

 

 

[root@250-shiyan sh]# bash let
2.22
[root@250-shiyan sh]# cat let
var=2
i=`echo "scale=2;$var*1.11"|bc`
echo $i

shell程序中的操作默認都是字符串操作
在bash中只提供了整數運算,一般shell通過let和expr這兩個指令來實現。
使用格式為: let "x=$x+1" 或者x=`expr $x+1`,同時,在shell中,也可以通過((表達式))。使用格式為:((x=$x+1))
shell腳本只提供整數算術運算(三種方式)—((表達式))、let "表達式"、value=`expr 表達式右邊`

整數運算
將需要運算的表達式寫入在expr 后面,保證參數與運算符號中間有空格隔開。
這其中的let可以用(())代替,let "j=i*6+2″等價於((j=i*6+2)), 就像很多的循環中用法一樣
注意:let必須是完整的算術表達式,即有等號兩邊
(())、expr 可以只有等號右邊的計算,由$((...))、$(expr ...)、`expr ...` 查看返回結果
let表達式內變量不用加$
let中運算符與操作數不能有空格,expr中運算符與操作數必須有空格

(( expression ))與let EXPRESSION是等效的

浮點運算
var=1
var=`echo "scale=1;$var*2.0"|bc`  bc預設輸出整數,用scale 指定小數點下位數
echo $var

output:
2.0

bc支持除位運算以外的所有運算。

另外一個支持浮點運算的方法是awk:
var=1
var=`echo "$var 1"|awk '{printf("%g",$1+$2)}'`
echo $var

output:
2

$ c=$(awk 'BEGIN{print 7.01*5-4.01 }')
$ echo $c

1:在shell 中$() 與 ``等效。執行中間包含的命令語句,返回執行結果。
2:從效率來說let==(()) > expr > bc。let和(())運行是內建命令,使用相同的算法。
3:let 和 expr 的運算是整數運算,不包括浮點預算。
4:expr和bc是外部程序,expr的體積幾乎等於bc的1/3,執行一次裝入內存所消耗的時間就不一樣。
5:從運算能力來說,bc排第一位。


let命令具有返回值.當計算結果(若有多個表達式時,以最后一個為准)為0時,
返回值為1,否則為0.
當表達式中含有shell的特殊字符(如|)時,需要用引用符('或")將其引用起來.
使用let時還需要注意的時,對於let x+y這樣的式子,shell雖然計算了x+y的值
但卻將結果丟棄,若不想這樣,可以使用let sum=x+y將x+y的結果保存在變量sum中
另外還可以使用((和))操作符取代let命令,而且這樣的話,還可以省去對算術
表達式的引用,如果想返回表達式的值,則需用$(())的格式.

if的條件中,“=”用於比較字符串;“-eq”用於比較整型數。

Bash shell 的算術運算有四種方式:
1:使用 expr 外部程式

加法 r=`expr 4 + 5`
echo $r
注意! '4' '+' '5' 這三者之間要有空白
r=`expr 4 * 5` #錯誤
乘法 r=`expr 4 \* 5`

2:使用 $(( ))
r=$(( 4 + 5 ))
echo $r

3:使用 $[ ]

r=$[ 4 + 5 ]
echo $r

乘法
r=`expr 4 \* 5`
r=$(( 4 * 5 ))
r=$[ 4 * 5 ]
echo $r

除法
r=`expr 40 / 5`
r=$(( 40 / 5 ))
r=$[ 40 / 5 ]
echo $r

減法
r=`expr 40 - 5`
r=$(( 40 - 5 ))
r=$[ 40 - 5 ]
echo $r

求余數
r=$[ 100 % 43 ]
echo $r

乘冪 (如 2 的 3 次方)
r=$(( 2 ** 3 ))
r=$[ 2 ** 3 ]
echo $r
注:expr 沒有乘冪

4:使用let 命令
加法:
n=10
let n=n+1
echo $n #n=11

乘法:
let m=n*10
echo $m

除法:
let r=m/10
echo $r


求余數:
let r=m%7
echo $r


乘冪:
let r=m**2
echo $r

雖然Bash shell 有四種算術運算方法,但並不是每一種都是跨平台的,建議使用expr。
另外,我們在 script 中經常有加1操作,以下四法皆可:
m=$[ m + 1]
m=`expr $m + 1`
m=$(($m + 1))
let m=m+1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM