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)
是无法被识别的。