『忘了再學』Shell基礎 — 20、Shell中的運運算元

2022-05-26 12:00:28

1、Shell常用運運算元

Shell中常用運運算元如下表:

優先順序數值越大優先順序越高,具有較高優先順序級別的運運算元先於較低階別的運運算元進行求值運算。

優先順序 運運算元 說明
13 -,+ 單目負、單目正
12 !,~ 邏輯非、按位元取反或二補數
11 *,/,% 乘、除、取模
10 +,- 加、減
9 <<,>> 按位元左移、按位元右移
8 <=,>=,<,> 小於或等於、大於或等於、小於、大於
7 ==,!= 等於、不等於
6 & 按位元與
5 ^ 按位元互斥或
4 ` `
3 && 邏輯與
2 `
1 =,+=,-=,/=
`%=,&=,^=,
=<br /><<=,>>=`

簡單範例:

# 例1:加減乘除
# 雖然乘和除的優先順序高於加,但是通過小括號可以調整運算優先順序。
[root@Lyl ~]# num=$(( (10+8)*6/2 ))
[root@Lyl ~]# echo $num
54

# 例2:取模運算
[root@Lyl ~]# num=$(( 19%5 ))
[root@Lyl ~]# echo $num
4

# 例3:邏輯與
# 邏輯與運算只有相與的兩邊都是1,與的結果才是1,否則與的結果是0
[root@Lyl ~]# value=$(( 1&&0 ))
[root@Lyl ~]# echo $value
0

2、Shell中數值運算的方法

在Shell中所有變數的預設型別是字串型,那如果我需要進行數值運算,可以採用以下三種方法中的任意一種:

(1)方式一

就是使用declare命令,把一個變數宣告成數值型別。

# 給變數aa和bb賦值
[root@Lyl tmp]# aa=11
[root@Lyl tmp]# bb=22

# 宣告變數cc的型別是整數型,它的值是aa和bb的和。
# 這裡注意一下,其實應該把變數aa和bb也通過declare命令宣告成數值型,
# 但是Shell這點還好,只把最後的和cc宣告成數值型,也是能進行計算的。
[root@Lyl tmp]# declare -i cc=$aa+$bb

# 輸出變數cc
[root@Lyl tmp]# echo $cc
33

該種方式並不太建議使用,編寫有些麻煩。雖然系統最終換算的方式還是用declare命令,但還是不推薦。

(2)方式二

使用exprlet數值運算工具,不推薦。

要想進行數值運算的第二種方法是使用expr命令,這種命令就沒有declare命令複雜了。

expr運算工具範例如下:

# 給變數aa和bb賦值
[root@Lyl ~]# aa=11
[root@Lyl ~]# bb=22

# aa和bb的求和。
# 注意「+」號左右兩側必須有空格。
[root@Lyl ~]# cc=$(expr $aa + $bb)

# 說明一下
# 我們之前說過$( )中呼叫的是系統命令,
# 換句話說$( )中`expr $aa + $bb `是一條運算命令。

# 輸出cc變數的值
[root@Lyl ~]# echo $cc
33


# 使用expr命令進行運算時,要注意元算符號左右兩側必須有空格,
# 否則會報錯,元算不能被執行。
[root@Lyl ~]# cc=$(expr $aa +$bb)
expr: 語法錯誤

let命令和expr命令基本類似,都是Linux中的運算命令。

let元算工具範例如下:

# 範例1
# 給變數aa和bb賦值
[root@Lyl ~]# aa=11
[root@Lyl ~]# bb=22

# aa和bb的求和。
[root@Lyl ~]# let cc=$aa+$bb
[root@Lyl ~]# echo $cc
33


# 範例2
# 定義變數n
[root@Lyl ~]# n=10

# 變數n的值等於變數本身再加1
[root@Lyl ~]# let n+=1
[root@Lyl ~]# echo $n
11

總結:

expr命令和let命令大家可以按照習慣使用,不過let命令對格式要求要比expr命令寬鬆,所以推薦使用let命令進行數值運算。

(3)方式三(推薦)

使用$((運運算元))或者$[運運算元]的方式進行運算。(兩種都可以)

# 給變數aa和bb賦值
[root@Lyl tmp]# aa=11
[root@Lyl tmp]# bb=22

# 求和
[root@Lyl ~]# cc=$(( $aa+$bb))
[root@Lyl ~]# echo $cc
33

總結:

$( )中存放的是系統命令,$(( ))中是進行數學運算的。

$[ ]不推薦使用,因為[ ]在Shell中有極其特殊且重要的作用,就是測試。(之後Shell程式設計的部分說明)

這三種數值運算方式,大家可以按照自己的習慣來進行使用,推薦使用方式三。