1. 程式人生 > >Linux shell 編程(六):運算

Linux shell 編程(六):運算

運算 shell let expr

運算

表達式

表達式包含在或(())[]內,

  • 算數表達式:(())

    • ((expression))
    • 這個表達式是根據算術計算的規則來計算的。相當於let expression
  • 條件計算表達式:[]

    • [expression]
    • 這是內置命令test的同義詞,以[開頭,以]結尾。

在表達式中可以進行進制轉換:$((NUMBER#SCALE)),$((10#8)=>8

要得到計算結果,需要在表達時前面加$符號,如:$[expression]$((expression))

  • 區別
    • 這兩種的區別在於((expr))可以在shell中執行,可以對變量進行賦值運算,而不需要在前面加$號
      ,如果表達式執行成功則執行結果為成功,否則是不成功,因此它可以作為if的判斷表達式。

命令計算表達式

在Linux中可以使用命令來計算表達式,如exprlet命令。

expr

expr命令用於計算表達式並將其標準輸出。

# Usage: expr EXPRESSION
# expression
# 運算操作符前後要有空格
  ARG1 | ARG2       位或運算

  ARG1 & ARG2       位與運算

  ARG1 < ARG2       ARG1 小於 ARG2
  ARG1 <= ARG2      ARG1 小於等於 ARG2
  ARG1 = ARG2       ARG1 等於 ARG2
  ARG1 != ARG2      ARG1 不等於 ARG2
  ARG1 >= ARG2      ARG1 大於等於 ARG2
  ARG1 > ARG2       ARG1 大於 ARG2

  ARG1 + ARG2       加法
  ARG1 - ARG2       減法

  ARG1 * ARG2       乘法 使用乘法時,操作符*應該被轉義:\*
  ARG1 / ARG2       除法
  ARG1 % ARG2       取余數

  STRING : REGEXP   REGEXP在STRING中的固定匹配

  match STRING REGEXP        與 STRING : REGEXP 相同,如果正則與字符串相匹配則返回匹配的字符個數,否則返回0
  substr STRING POS LENGTH   字符串截取,POS時開始位置,POS最小為1,LENGTH是截取長度
                             # 如:
                                expr substr raojinlin 1 3
                                上面命令將輸出:rao
  index STRING CHARS         CHARS 是字符,STRING是字符串,這個表達式輸出字符在字符串中第一次出現的位置,如果字符不在字符串中則輸出0
  length STRING              字符串的長度
  + TOKEN                    將令牌解釋成字符串,向`match`或`/`這樣的操作符     

  ( EXPRESSION )             EXPRESSION的值

let

let用來計算算數表達式,let不會將計算結果標準輸出,而是將結果直接賦值給了變量。

語法:let arg [arg]

let計算每個ARG作為算術表達式。對固定寬度的整數進行評估,不檢查是否溢出,但將0除格並標記為錯誤。下面的操作符列表分組為等優先級操作符的級別。這些等級是按優先順序排列的。

  • let 參數
    
        id++, id--  變量自增和自減,運算前先調用變量在運算,如果變量不存在則創建一個
        ++id, --id  變量自增和自減,運算前先運算在調用,如果變量不存在則創建一個
        -, +        整數和負數
        !, ~        一個布爾操作符,用於將操作的值強制轉換為布爾值並取反;位反運算
        **          冪運算
        *, /, %     乘法,除法,取余數
        +, -        加法,減法
        <<, >>      左移運算和右移運算,let執行結果為表達式的計算結果
        <=, >=, <, >    比較操作符,let執行結果為表達式的計算結果
        ==, !=      等於,不等於
        &       位與 AND
        ^       位異或 XOR
        |       位或 OR
        &&      邏輯與 AND
        ||      邏輯或 OR
        expr ? expr : expr
                條件操作,三元運算
        =, *=, /=, %=,
        +=, -=, <<=, >>=,
        &=, ^=, |=  賦值運算

## 運算符

`ID++ ID--‘
變量自增和自減
運算前先調用變量在運算

`++ID --ID‘
變量自增和自減
運算前先運算在調用變量

`- +‘
正數負數

`! ~‘
一個布爾操作符,用於將操作的值強制轉換為布爾值並取反。
位反運算

`**‘
求冪運算

`* / %‘
乘、除、余數

`+ -‘
算數加法和減法

`<< >>‘
左移運算
右移運算

`<= >= < >‘
比較操作

`== !=‘
等於和不等於

`&‘
位與運算

`^‘
位異或運算

`|‘
位或運算

`&&‘
邏輯與

`||‘
logical OR

`expr ? expr : expr‘
三元表達式
如果第一個表達式為真,這執行第二個表達式,否則執行第三個表達式

`= *= /= %= += -= <<= >>= &= ^= |=‘
賦值運算

`expr1 , expr2‘
逗號


## 示例

* ```expr```
root@iZuf6ilzd4iqvuj4dvuiwtZ:~# expr 1 + 1
2
root@iZuf6ilzd4iqvuj4dvuiwtZ:~# expr 1 \* 1
1
root@iZuf6ilzd4iqvuj4dvuiwtZ:~# expr index raojinlin r
1
root@iZuf6ilzd4iqvuj4dvuiwtZ:~# expr substr raojinlin 3 4
ojin
root@iZuf6ilzd4iqvuj4dvuiwtZ:~# 
```
  • let

    root@iZuf6ilzd4iqvuj4dvuiwtZ:~# a=1
    root@iZuf6ilzd4iqvuj4dvuiwtZ:~# let a++
    root@iZuf6ilzd4iqvuj4dvuiwtZ:~# let a*=2
    root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo $a
    4
    root@iZuf6ilzd4iqvuj4dvuiwtZ:~# 
    
  • (())
    # a 為上面let示例中的a變量,其值為2
    root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo $((a+1)) # shell將會解釋a變量
    5
    root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo $((a+1 * 2))
    6
    root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo $((a+1 * 2 / 2))
    5
  • []

    root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo $[a+4]
    8
    root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo $[23+4]
    27
    root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo $[23 <=4]
    0
    

Linux shell 編程(六):運算