Shell——数学运算


1)let操作符

使用let命令可以执行基本的整数算数操作,let命令的使用须遵循以下几点:

  • 只支持整数运算
  • 使用let,变量名之前不需要加$符号
  • 运算符号两侧不能有空格
  • 需要有变量接收let的结果
  • let支持基本的运算准则:先乘除后加减,括号里的先运算

格式:let res=x+y,x和y需是已被赋值的变量,并且变量需为整数,res用于接收x+y的结果。


自加(++)、自减(- -)操作

自加(++)和自减(- -)会改变变量的值。

自加格式:let x++,let与变量间有空格,变量与++直接不能有空格。

自减格式:let x--,书写规范同理。

[wjj@learning ~]$ x=1
[wjj@learning ~]$ echo $x
1
[wjj@learning ~]$ let x++
[wjj@learning ~]$ echo $x
[wjj@learning ~]$ let x--
[wjj@learning ~]$ echo $x
1

前置++与后置++

C语言中前置++,与后置++有明显的区别:

  • 前置++:先++,再执行
  • 后置++:先执行,最后++

因为Shell是由C语言开发出来的,Shell中的前置++与后置++同样遵循上述原则

例1:

x=1 y=1
let z=(x++)+y;echo "z=$z x=$x y=$y"
z=2 x=2 y=1
  • 显然,后置++的运算优先级较低
  • 如果运算中有++操作,需要用括号括起来
  • 因为是后置++,所以先执行z=x+y,最后再执行x++

例2:

x=1 y=1
let z=(++x)+y;echo "z=$z x=$x y=$y"
z=3 x=2 y=1
  • 前置++优先级较高
  • 先执行++x,再执行x+y

**注意:**自加与自减操作只适用于计算参数x y,不适用于接收let命令的z


+=、-=、*=和/=

Shell中+=-=操作符与C语言中一致:

let x+=y等同于let x=x+y

let x-=y等同于let x=x-y

let x*=y等同于let x=x*y

let x/=y等同于let x=x/y

2)(( ))操作符

(( ))与let一样,支持基本的整数算数操作,需遵循以下几点:

  • 只支持整数运算
  • 运算写在最内层括号中
  • 运算符号两边可以有空格
  • 可以用变量接收结果,也可以不接收
  • 支持逻辑运算

例1:

echo $((1 + 1))
2
echo $((z = 1 + 1))
2
echo $z
2
  • 括号内的书写规范允许有空格
  • 可以用$提取运算后的结果

例2:

x=1 y=1
echo $((z=(x++)+y))
2
echo $((z += 1))
3
  • 前置++、后置++、+=和-=同样适用

3)[ ] 操作符

[ ]操作符的使用方法与前二者大致一样,遵循:

  • 只支持整数运算
  • []中可以使用$前缀,也可以不使用$访问变量
  • 支持逻辑运算

例1:

echo $[1 + 2]
3
x=$[1 + 2]; echo $x
3
  • [ ]中允许有空格
  • 可以不用变量接收其计算结果

例2:

y=1
x=$[$y + 1]; echo $x
2
  • []中允许访问变量,变量名前需加符号$

例3:

y=1
x=$[$y + ((1+2))]; echo $x
4
x=$(( $y + $[1+2])); echo $x
4
  • []中允许访问变量,变量名前需加符号$
  • [](())和相互嵌套使用

4)逻辑判断

Shell中兼容C语言中的逻辑判断,以下符号当在运算中出现时,表示逻辑判断

符号 说明
||或| 逻辑或
&&或& 逻辑且
>= 大于等于
<= 小于等于
!= 不等于
== 等于判断

当逻辑判断成立时,返回1(true);条件不成立时,返回0(false)。

(())[]中同样支持逻辑运算:

a=$[1 > 2 && 1 < 3];echo $a
0
b=$((1 < 2 || 1 > 3));echo $b
1

5)expr工具

expr工具同样可以用于基本的算数操作,当然也仅限于整数操作

  • 使用expr运算必须加空格
  • expr支持逻辑运算

例1:

a=`expr 1 + 2`
a=$(expr $a + 1)
  • expr每个变量和运算符直接必须有空格

例2:

a=`expr 1 > 2`; echo $a
0
  • expr同样支持逻辑运算

6)bc工具

bc是一个用于数学运算的高级实用工具,这个精密的计算包含了大量的选项。可以借助它执行浮点数运算并使用一些高级函数。

例1:浮点数计算

echo "4 * 0.5" | bc
2.0

x=10
y=`echo "$x * 0.5" | bc`
echo $x
5.0

bc可以接收操作控制前缀,前缀之间以分号间隔。

例2:设置小数精度

echo "scale=2; 10 / 2 " | bc
5.00

通过参数scale=2将小数位数设为2,因此打印结果保留2位小数。

bc可以实现不同进制的转换功能

例3:进制转换

n=10
#二进制
echo "obase=2;$n" | bc
1010
#八进制
echo "obase=8;$n" | bc
12
#十六进制
echo "obase=16;$n" | bc
A

上述代码演示了十进制数字转换成二进制、八进制和十六进制。

其中obase是输出控制,用来控制输出内容是几进制的;此外,ibase是输入控制,用于控制输入数字的进制

n=1010
#二进制转换成十进制
echo "obase=10;ibase=2;$n" | bc

**注意:ibase需要设置在变量之前!**以下写法都是正确的:

  • echo "obase=10;ibase=2;$n" | bc
  • echo "ibase=2;$n;obase=10;" | bc

根据计算机读取命令的特性,这样可以保证计算机在读取变量时,第一时间找到ibase输入控制,否则将默认以十进制进行存储。

例4:计算平方及平方根

echo "sqrt(100)" | bc
10
echo "2^3" | bc
8

bc中还有丰富的数学函数库,通过--mathlib-l选项使用这些高级函数。

例5:正弦与余弦

#正弦
echo "s(3.1415926/2)" | bc --mathlib
.99999999999999964101
#余弦
echo "c(0)" | bc --mathlib
1.00000000000000000000

bc还可以对文件进行操作

例6:完成文件中的计算

cat > bctest.bc << "EOF"
sqrt($a)
2^3
EOF
cat bctest.bc | bc --mathlib
10.00000000000000000000
8

注意:该方法是把文件通过管道传给bc,因此无法在文件中使用变量,例如:sqrt($a)是无法被识别的。

猜你喜欢

转载自blog.csdn.net/why1472587/article/details/128525918