SHELL之數值運算

*一炁化三清*發表於2024-08-20

【四則運算子號】

表示式 舉例
$(( )) echo $((1+1))
$[ ] echo $[10-5]
expr expr 10 / 5 (運算子左右有空格)
let n=1;let n+=1 等價於 let n=n+1

一、整數運算
1、基本運算類別

  • 加法:+
  • 減法:-
  • 乘法:*
  • 整除:/
  • 取餘數:%

2、expr運算工具

  • 加法:+
  • 減法:-
  • 乘法:*
  • 整除:/
  • 取餘數:%

3、$[ ]算式替換

使用$[ ] 或 $(( ))表示式

  • 格式:$[整數1 運算子 整數2 .. ..]
  • 乘法操作*無需轉譯,運算子兩側可以無空格
  • 引用變數可省略$符號
  • 計算結果替換表示式本身,可結合echo命令輸出

注意:

指令碼第2行
	if [ $# -lt 1  -o $1 -gt 9  ] ; then
如果替換為 :
	if (( $# <  1  ||  $1  >  9  )); then
結果會怎麼樣 ? 為什麼 ? 
在判斷數值大小除了可以用”(( ))”的形式外,還可以使用”[ ]”。但是就不能使用>, < , = 這樣的符號了,要使用 -lt (小於),-gt (大於),-le (小於等於),-ge (大於等於),-eq (等於),-ne (不等於)

&&,邏輯的and的意思, -a也是這個意思;
||,邏輯的or的意思, -o 也是這個意思

[root@scp1 ~]# x=30
[root@scp1 ~]# echo $[x+20]
50
[root@scp1 ~]# echo $((x+10)),$((x*60))
40,1800

4、變數的自增/減等操作

使用$[]替換,或let命令完成
結合echo命令檢視結果

二、小數運算

1、整數運算的侷限性

  • bash內建機制僅支援整數值運算
  • expr命令、$[] 算式運算不支援有小數的運算

2、使用bc實現小數的運算

多數linux系統預設安裝此工具

  • 支援高精度的數值運算
  • 直接執行bc可進入互動式運算介面,quit退出
  • 設定scale=n 可約束小數位

結合管道向bc傳送表示式

  • 多個表示式以分號分隔
  • 透過echo命令+管道傳遞要計算的表示式

小數值的比較
基本用法

  • echo "數值1 比較符 數值2" | bc
  • 如果表示式成立,則返回的計算結果為1,否則返回0
  • 常見的比較操作:>、>=、<、<+、==、!=

三、瞭解i++和++i

  • ++ 是字尾自增運算子,表示在表示式求值後,變數 i 的值增加 1。
  • ++j 是字首自增運算子,表示在表示式求值前,變數 j 的值增加 1。

在表示式 let x=i++ 中,i 的值在賦值給 x 後增加,所以 x 得到的是 i 增加前的值。而在表示式 let y=++j 中,j 的值在賦值給 y 之前就已經增加了,所以 y 得到的是 j 增加後的值。

1、對變數的值的影響

[root@MissHou ~]# i=1
[root@MissHou ~]# let i++
[root@MissHou ~]# echo $i
2
[root@MissHou ~]# j=1
[root@MissHou ~]# let ++j
[root@MissHou ~]# echo $j
2

2、對錶達式的值的影響

[root@MissHou ~]# unset i j
[root@MissHou ~]# i=1;j=1
[root@MissHou ~]# let x=i++         先賦值,再運算
[root@MissHou ~]# echo $x
1
[root@MissHou ~]# let y=++j         先運算,再賦值
[root@MissHou ~]# echo $y
2
[root@MissHou ~]# echo $i
2
[root@MissHou ~]# echo $j
2

相關文章