Linux shell 编程(六):运算

运算

表达式

表达式包含在或(())[]内,

  • 算数表达式:(())

    • ((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
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章