SHELL之数值运算
【四则运算符号】
表达式 | 举例 |
---|---|
$(( )) | echo $((1+1)) |
$[ ] | echo $[10-5] |
expr | expr 10 / 5 (运算符左右有空格) |
let | n=1;let n+=1 等价于 let n=n+1 |
一、整数运算
1、基本运算类别
- 加法:+
- 减法:-
- 乘法:*
- 整除:/
- 取余数:%
2、expr运算工具
- 加法:+
- 减法:-
- 乘法:*
- 整除:/
- 取余数:%
3、$[ ]算式替换
使用$[ ] 或 $(( ))表达式
- 格式:$[整数1 运算符 整数2 .. ..]
- 乘法操作*无需转译,运算符两侧可以无空格
- 引用变量可省略$符号
- 计算结果替换表达式本身,可结合echo命令输出
$(()) 是标准的算术运算语法,而 $[] 不是标准的,可能是特定环境下的别名或特殊配置。在编写可移植的Shell脚本时,应优先使用 $(())。
注意:
脚本第2行
if [ $# -lt 1 -o $1 -gt 9 ] ; then
如果替换为 :
if (( $# < 1 || $1 > 9 )); then
结果会怎么样 ? 为什么 ?
在判断数值大小除了可以用”(( ))”的形式外,还可以使用”[ ]”。但是就不能使用>, < , = 这样的符号了,要使用 -lt (小于),-gt (大于),-le (小于等于),-ge (大于等于),-eq (等于),-ne (不等于)
&&,逻辑的and的意思, -a也是这个意思;
||,逻辑的or的意思, -o 也是这个意思
[root@scp1 ~]# x=30
[root@scp1 ~]# echo $[x+20]
50
[root@scp1 ~]# echo $((x+10)),$((x*60))
40,1800
4、变量的自增/减等操作
使用$[]替换,或let命令完成
结合echo命令查看结果
二、小数运算
1、整数运算的局限性
- bash内建机制仅支持整数值运算
- expr命令、$[] 算式运算不支持有小数的运算
2、使用bc实现小数的运算
多数linux系统默认安装此工具
- 支持高精度的数值运算
- 直接运行bc可进入交互式运算界面,quit退出
- 设置scale=n 可约束小数位
结合管道向bc发送表达式
- 多个表达式以分号分隔
- 通过echo命令+管道传递要计算的表达式
小数值的比较
基本用法
- echo "数值1 比较符 数值2" | bc
- 如果表达式成立,则返回的计算结果为1,否则返回0
- 常见的比较操作:>、>=、<、<+、==、!=
三、了解i++和++i
- ++ 是后缀自增运算符,表示在表达式求值后,变量 i 的值增加 1。
- ++j 是前缀自增运算符,表示在表达式求值前,变量 j 的值增加 1。
在表达式 let x=i++ 中,i 的值在赋值给 x 后增加,所以 x 得到的是 i 增加前的值。而在表达式 let y=++j 中,j 的值在赋值给 y 之前就已经增加了,所以 y 得到的是 j 增加后的值。
1、对变量的值的影响
[root@MissHou ~]# i=1
[root@MissHou ~]# let i++
[root@MissHou ~]# echo $i
2
[root@MissHou ~]# j=1
[root@MissHou ~]# let ++j
[root@MissHou ~]# echo $j
2
2、对表达式的值的影响
[root@MissHou ~]# unset i j
[root@MissHou ~]# i=1;j=1
[root@MissHou ~]# let x=i++ 先赋值,再运算
[root@MissHou ~]# echo $x
1
[root@MissHou ~]# let y=++j 先运算,再赋值
[root@MissHou ~]# echo $y
2
[root@MissHou ~]# echo $i
2
[root@MissHou ~]# echo $j
2