[ Shell入门教程 ] Shell编程中数值计算方法实例
SHELL编程中经常会涉及到数值计算,有时候对于这些计算命令使用场景容易忘记或者混淆,这里针对常用的命令做个总结。主要包括let、bc、expr、(())等。
1、let
使用格式:let 表达式,表达式必须是完整的表达式,即等号两边。只能赋值,不支持浮点数运算,不支持直接输出
$ var=10
$ let var+=2 #var=12,中间不能有空格
$ let var=var+2 #var=14
$ let var*=2 #var=28
$ let var/=2 # var=14
无法计算浮点数,报错
$ var=2.5
$ let var+=1
-bash: let: 2.5: 语法错误: 无效的算术运算符 (错误符号是 ".5")
2、bc
常用,支持浮点数运算
echo "1+1" | bc # 2
echo "1.5+1.5" | bc # 3.0
echo "3-1.2" | bc #1.8
echo "1.5*1.5" | bc #2.2
echo "10/3" | bc # 3
echo "scale=2;10/3" | bc #3.33
看到乘数和除数的精度不同了吗?设置其他参数测试下
echo "1.5*1.33333" | bc #1.99999
echo "1.5111111111111111111111*1.33333" | bc #2.0148097777777777777777
echo "4/5" | bc #0
echo "1/2" | bc #0
echo "6/5" | bc # 1
乘法输出结果的精度和相乘数最长的进度保持一致。整数相除结果下取整。当然,它是可以赋值的
var=$(echo "1+1"|bc) #var=2
3、expr
不支持浮点数运算,注意数字与计算符中的空格
expr 1 + 1 #2
expr 1 - 1 #0
expr 1 \* 1 #1,注意*号前面有\,否则报错
expr 1 / 1 #1
expr 1+1 #1+1,与预期不符
expr 1.0 + 1 #输出语法错误
var=$(expr 1 + 1) #var=2
var2=$(expr ${var} + 2) #var2=4
4、$(())
不支持浮点数运算,不支持窗口直接执行$(()),
var=$((1+1)) #1+1运算符前后中间是否有空格不影响计算
v1=10
v2=15
var=$((v1+v2))
var=$(($v1+$v2))
a=$(( 1 + 1.0 )) #提示语法错误
可以发现,在$(())中的变量带不带$取值符号都不影响计算。
5、awk
awk结合print的使用可以很好的各种完成数值计算,包括浮点数及精度控制。
$ awk 'BEGIN{printf 1.0/2.0}' #0.5
$ awk 'BEGIN{printf "5.2f%",10/3}' #3.33
$ var1=10
$ var2=3
$ awk -v v1=${var1} -v v2=${var2} 'BEGIN{printf "%5.2f\n",v1/v2}' #3.33
最后来看个实例,输出1~5的数值
#!/bin/bash
i=1
MAX=5
while [ ${i} -lt ${MAX} ];do
printf "${i}\n"
i=$(($i+1))
done
输出结果
1
2
3
4
分类:
Shell入门教程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义