shell 脚本编程之算术运算符

来源:互联网 发布:旅行收纳袋 知乎 编辑:程序博客网 时间:2024/05/16 17:50

基本算术运算符

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

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

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

#learn_opeartor.sh#!/bin/bashnum1=10num2=4let "num3=$num1+$num2"echo $num1+$num2=$num3let "num3=num1-num2"echo $num1-$num2=$num3let "num3=num1/num2"echo $num1/$num2=$num3let "num3=num1%num2"echo $num1%$num2=$num3let "num3=num1**2"echo $num1**2=$num3let "num3+=num1"echo +=: $num3let "num3-=num2"echo -=: $num3let "num3%=num2"echo %=: $num3let "num3=num1++"echo num1++: $num3let "num3=++num1"echo ++num1: $num3let "num3=num1<<1"echo 左移一位 $num3let "num3=num1>>2"echo 右移两位 $num3let "num3=~num1"echo 按位取反 $num3let "num3=num1&num2"echo 按位与 $num3let "num3=num1|num2"echo 按位或 $num3let "num3=num1^num2"echo 按位异或 $num3

执行结果

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

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

变量 十进制值 二进制值 num1 12 00001100 num2 4 00000100 num1<<1 24 00011000 num1>>2 3 00000011 ~num1 -13 11110011 num1&num2 4 00000100 num1|num2 12 00001100 num1^num2 8 00001000

取反那里比较难理解,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 $num4[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+21+2[ljx@localhost ~]$ expr 1 + 23[ljx@localhost ~]$ expr 2 * 3expr: syntax error[ljx@localhost ~]$ expr 2 \* 36[ljx@localhost ~]$ num=expr 1 + 2bash: 1: command not found
  • 使用 declare 内建命令定义变量,可以显式地把变量定义成“整数”,这样就可以直接将算术运算的结果赋给变量了,这种方式同样处理不了位运算
[ljx@localhost ~]$ declare -i var[ljx@localhost ~]$ var=10/3[ljx@localhost ~]$ echo $var3[ljx@localhost ~]$ var=var+5[ljx@localhost ~]$ echo $var8[ljx@localhost ~]$ var=$var-10[ljx@localhost ~]$ echo $var-2
原创粉丝点击