Shell 学习(6)Bash 的算术扩展

与其他语言都大同小异。

算术扩展表达式

1、语法:(( ... )),可以进行整数的运算。

# 通过算术表达式定义一个变量
$ ((var1 = 10 + 10))
$ echo ${var1}
20

读取运算结果,需要在头部追加美元符:$(( ... ))

# 错误示范
$ echo ((10 + 10))
-bash: syntax error near unexpected token `('

# 直接输出
$ echo $((10 + 10))
20

# 运算结果赋值给变量
$ var1=$((1+1))
$ echo ${var1}
2

2、表达式中使用变量

var1=10

# 通过扩展获取变量值
$ echo $(( ${var1} ** 2 ))
100

# 直接通过变量名也是可以取到变量值的
$ echo $(( var1 ** 2 ))
100

# 若读取了一个不存在的变量,会被视为0处理
$ echo $(( tempVar + 2))
2

3、算术表达式支持运算符:

整数运算符
  • +:加法
  • -:减法
  • *:乘法
  • /:除法(整除,返回结果总是整数)
  • %:余数
  • **:指数
  • ++:自增运算(前缀或后缀)
  • --:自减运算(前缀或后缀)

除法:返回结果总是整数

$ echo $((5 / 2))
2

自增、自减:作为前缀时先计算在返回结果,作为后缀时先返回在计算结果。

# 自增
v$ ar1=1
$ echo $((var1++))
1
$ echo ${var1}
2
$ echo $((++var1))
3

# 自减
echo $((var1--))
3
$ echo ${var1}
2
$ echo $((--var1))
1
位运算:

数值的进制:Bash 的数值默认都是十进制,但是在算术表达式中,也可以使用其他进制。

  1. number:没有任何特殊表示法的数字是十进制数(以10为底)。
  2. 0number:八进制数。
  3. 0xnumber:十六进制数。
  4. n#number:n进制的数。
# 十六进制
$ echo $((0xff))
255

# 二进制
$ echo $((2#11111111))
255
  • <<:位左移运算,把一个数字的所有位向左移动指定的位。
  • >>:位右移运算,把一个数字的所有位向右移动指定的位。
  • &:位的“与”运算,对两个数字的所有位执行一个AND操作。
  • |:位的“或”运算,对两个数字的所有位执行一个OR操作。
  • ~:位的“否”运算,对一个数字的所有位取反。
  • ^:位的异或运算(exclusive or),对两个数字的所有位执行一个异或操作。
$ echo $((16>>2))
4
$ echo $((16<<2))
64

# 17的二进制:10001,3的二进制11
$ echo $((17&3))
1
$ echo $((17|3))
19
$ echo $((17^3))
18
逻辑运算:如果逻辑表达式为真,返回1,否则返回0。
  • <:小于
  • >:大于
  • <=:小于或相等
  • >=:大于或相等
  • ==:相等
  • !=:不相等
  • &&:逻辑与
  • ||:逻辑或
  • !:逻辑否
  • expr1?expr2:expr3:三元条件运算符。expr1为真返回expr2,否则返回expr3。
$ echo $((3 > 2))
1
$ echo $(( (3 > 2) || (4 <= 1) ))
1

$ echo $(( 1 ? 2 : 3))
2
赋值运算:
  • var = value:简单赋值。
  • var += valuevar = var + value
  • var -= valuevar = var – value
  • var *= valuevar = var * value
  • var /= valuevar = var / value
  • var %= valuevar = var % value
  • var <<= valuevar = var << value
  • var >>= valuevar = var >> value
  • var &= valuevar = var & value
  • var |= valuevar = var | value
  • var ^= valuevar = var ^ value

4、更改计算优先级

先计算括号中的内容

$ echo $(( (1 + 2) * 3 ))
9

5、嵌套运算

$ echo $(( (2 ** 2) + 3 ))
7

$ echo $(( $((2 ** 2)) + 3 ))
7

6、只支持整数运算

$ echo $((1.5 + 1))
-bash: 1.5 + 1: syntax error: invalid arithmetic operator (error token is ".5 + 1")

expr 命令

该命令可以实现(( ... ))这样的写法的整数计算功能,不过相比较写法上还是有许多需要注意的不同点。而且还支持字符串操作。详细写法现用现查。

let 命令

该命令声明变量时,可以直接执行算术表达式。

$ let var1=10

# 不同于 readonly,并不会对变量添加 -i 属性
$ declare -p var1
declare -- var1="10"

测试:

$ let var1=10
$ echo ${var1}
10
$ var1=10+10
$ echo ${var1}
10+10

$ let var1=10+10
$ echo ${var1}
20

说明,只有在声明赋值时才能使用算术表达式。

参数表达式如果包含空格,就需要使用引号:

let "var1 = 10 + 20"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值