shell 脚本编程之算术运算符

基本算术运算符

shell 的算术运算符只支持整数,浮点数的运算结果会被转换成整数。算术运算符包括 + - * \ % **(幂运算) += -= *= \= %= ++ – <<(位左移) >>(位右移) &(按位与) |(按位或) ^(按位异或) ~(按位非)。使用 let “expression” 的方式将运算的结果保存到变量中,如果直接写 var=var1+var2 这种赋值方式,则得到的结果是字符串。

[ljx@localhost ~]$ num=1+2
[ljx@localhost ~]$ echo $num
1+2
[ljx@localhost ~]$ let "num=1+2"
[ljx@localhost ~]$ echo $num
3

下面写一个脚本,测试一下各种算术运算符

#learn_opeartor.sh
#!/bin/bash
num1=10
num2=4
let "num3=$num1+$num2"
echo $num1+$num2=$num3
let "num3=num1-num2"
echo $num1-$num2=$num3
let "num3=num1/num2"
echo $num1/$num2=$num3
let "num3=num1%num2"
echo $num1%$num2=$num3
let "num3=num1**2"
echo $num1**2=$num3
let "num3+=num1"
echo +=: $num3
let "num3-=num2"
echo -=: $num3
let "num3%=num2"
echo %=: $num3
let "num3=num1++"
echo num1++: $num3
let "num3=++num1"
echo ++num1: $num3

let "num3=num1<<1"
echo 左移一位 $num3
let "num3=num1>>2"
echo 右移两位 $num3
let "num3=~num1"
echo 按位取反 $num3
let "num3=num1&num2"
echo 按位与 $num3
let "num3=num1|num2"
echo 按位或 $num3
let "num3=num1^num2"
echo 按位异或 $num3

执行结果

10+4=14
10-4=6
10/4=2
10%4=2
10**2=100
+=: 110
-=: 106
%=: 2
num1++: 10
++num1: 12
左移一位 24
右移两位 3
按位取反 -13
按位与 4
按位或 12
按位异或 8

在 let 字符串中的变量加不加 $ 符号都可以。前面的几个运算很简单,主要看看后面几个。自增符号 ++ 和自减符号 – 要区分前缀和后缀,像例子中 num1 原来的值为 10,num3=num1++ 为后缀表达式,先赋值再自增,因此 num3 的值为 10,这时 num1 的值为 11;然后 num3=++num1 为前缀表达式,先自减再赋值,此时 num1 的值为 12,num3 的值也为 12。
接下来是位运算符

变量十进制值二进制值
num11200001100
num2400000100
num1<<12400011000
num1>>2300000011
~num1-1311110011
num1&num2400000100
num1|num21200001100
num1^num2800001000

取反那里比较难理解,00001100 取反之后的结果是 11110011,这个结果是补码,计算机保存的是补码,大多数语言也是用补码来表示数值的。根据这个补码结果,可以推导出原码,再根据原码计算它的十进制数值。首先,反码转补码是最后一位加一,那么补码转反码就是最后一位减一,因此根据补码 11110011 得到反码 11110010;然后原码转反码是符号位保持不变,其它位全部取反,反码转原码也一样,因此根据反码 11110010 得到原码 10001101,根据这个原码得到十进制数 -(8+4+1)=-13。

算术扩展

前面讲到,要做算术运算,必须使用 let 关键字,然后在一个字符串中作运算并把运算结果保存到变量中。下面讲几种算术扩展的方式,可以直接作运算并赋值,还可以在 shell 中直接输出运算结果而不需要保存到变量中。
* 使用 $[] 作运算,可以对直接量或变量进行算术运算操作

[ljx@localhost ~]$ echo $[10**3]
1000
[ljx@localhost ~]$ num=$[8>>1]
[ljx@localhost ~]$ echo $num
4
[ljx@localhost ~]$ echo $[num+2]
6
[ljx@localhost ~]$ echo $[$num*3]
12
  • 使用 $(()) 作运算,可以对直接量和变量进行算术运算操作,和 $[] 作用一样
[ljx@localhost ~]$ num=18
[ljx@localhost ~]$ echo $((num**2))
324
[ljx@localhost ~]$ echo $(($num/18))
1
[ljx@localhost ~]$ echo $((18**2))
324
  • 使用 expr 作运算,用于在 shell 中交互作算术运算,运算符与操作数之间要用空格隔开,特殊算术运算符必须转义,另外这种方式处理不了位运算
[ljx@localhost ~]$ expr 1+2
1+2
[ljx@localhost ~]$ expr 1 + 2
3
[ljx@localhost ~]$ expr 2 * 3
expr: syntax error
[ljx@localhost ~]$ expr 2 \* 3
6
[ljx@localhost ~]$ num=expr 1 + 2
bash: 1: command not found
  • 使用 declare 内建命令定义变量,可以显式地把变量定义成“整数”,这样就可以直接将算术运算的结果赋给变量了,这种方式同样处理不了位运算
[ljx@localhost ~]$ declare -i var
[ljx@localhost ~]$ var=10/3
[ljx@localhost ~]$ echo $var
3
[ljx@localhost ~]$ var=var+5
[ljx@localhost ~]$ echo $var
8
[ljx@localhost ~]$ var=$var-10
[ljx@localhost ~]$ echo $var
-2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值