当前位置: 首页 > article >正文

Shell脚本中的算术运算:let、(())、expr三种方式全解析(附避坑指南)

Shell脚本算术运算深度指南从基础到高阶实战在自动化脚本编写和数据处理中算术运算是最基础却最容易出错的部分。Shell作为字符串处理起家的脚本语言其数值计算有着独特的语法规则和陷阱。本文将彻底解析三种主流算术运算方式并分享实际项目中的避坑经验。1. Shell算术运算基础认知Shell默认将所有变量视为字符串这一设计源于其最初作为命令解释器的定位。当我们需要进行数值计算时必须显式地告诉Shell这不是字符串操作。理解这个核心差异是避免后续各种奇怪错误的关键。三种主流算术运算方式各有特点let命令最接近传统编程语言的写法双括号(())简洁高效的语法糖expr命令老派但兼容性最好的方法先看一个典型问题场景a5 b10 echo $a $b # 输出5 10而非15这种字符串拼接行为正是Shell的默认处理方式。要真正实现算术运算必须使用专门的语法结构。2. let命令类C风格的数值运算let命令提供了最接近传统编程语言的算术运算体验特别适合有C/Java背景的开发者。其核心特点是直接修改变量值支持复合赋值运算符允许省略变量引用符号$2.1 基础用法let sum53 # 简单加法 let resultsum*2 # 使用变量运算 echo $result # 输出16let的强大之处在于支持完整的运算符集合let a5, b3 # 多表达式逗号分隔 let a # 自增运算 let b%2 # 取模赋值2.2 实战技巧与陷阱典型错误1空格敏感let a 5 3 # 错误等号两边不能有空格典型错误2字符串自动转换let valabc5 # 当abc未定义时会被当作0处理推荐写法# 安全检测写法 [[ -n $num ]] let resultnum*2 || echo 变量未定义性能对比测试百万次循环运算类型let耗时(())耗时expr耗时简单加法0.82s0.79s3.15s复合运算1.05s1.02sN/A3. 双括号(())简洁高效的算术扩展(())结构是bash的算术扩展语法相比let具有更简洁的书写方式。其显著特点是表达式结果可以直接参与字符串拼接支持所有C风格运算符不需要对特殊字符进行转义3.1 基础语法((count 5 3)) # 标准赋值写法 echo $((5 * 3)) # 直接输出结果 result$((count 1)) # 赋值给变量(())支持的高级特性((a1, b2)) # 多表达式逗号分隔 echo $((a b ? 5 : 3)) # 三目运算符3.2 常见问题解决方案浮点数运算方案# 使用bc处理浮点运算 result$(echo scale2; 5/3 | bc)大整数溢出处理# 检查整数溢出 max_int$((2**63-1)) ((input max_int)) echo 超出整数范围进制转换技巧echo $((16#FF)) # 十六进制转十进制 echo $((8#77)) # 八进制转十进制4. expr命令老而弥坚的兼容方案expr是最古老的Unix算术命令虽然语法略显繁琐但在以下场景仍不可替代需要兼容老版本Shell与正则表达式配合使用需要额外参数检查时4.1 正确使用姿势expr 5 3 # 基本加法注意空格 expr 5 \* 3 # 乘法需要转义 expr expr 5 3 \* 2 # 嵌套运算expr的特殊返回值处理if expr $str : [0-9]*$ /dev/null; then echo 纯数字字符串 fi4.2 性能优化方案对于高频运算应避免重复调用expr# 低效写法 for i in {1..100}; do result$(expr $i \* 2) done # 高效写法 for i in {1..100}; do ((resulti*2)) done5. 综合对比与选型指南三种方式的核心差异总结特性let(())expr语法简洁度中等最高最低性能高最高低兼容性bash/zshbash/zsh所有Shell浮点运算不支持不支持不支持返回值处理修改变量返回结果输出结果选型建议现代脚本优先使用(())需要最大兼容性时选择expr复合运算场景使用let更清晰复杂运算的推荐组合方案# 混合使用案例 input5.3 int_part$(expr $input : \([0-9]*\)) ((dec_part10#${input#*.})) # 处理小数部分 echo 整数部分$int_part小数部分$dec_part最后分享一个真实案例在自动化部署脚本中我们需要计算剩余磁盘空间百分比。最初使用expr导致脚本运行缓慢改为(())后性能提升4倍同时代码更易维护# 优化前 used$(expr $(df -h / | awk NR2{print $3} | tr -d G) \* 100 / $(df -h / | awk NR2{print $2} | tr -d G)) # 优化后 total$(df -h / | awk NR2{print $2} | tr -d G) used$(df -h / | awk NR2{print $3} | tr -d G) ((percentused*100/total))

相关文章:

Shell脚本中的算术运算:let、(())、expr三种方式全解析(附避坑指南)

Shell脚本算术运算深度指南:从基础到高阶实战 在自动化脚本编写和数据处理中,算术运算是最基础却最容易出错的部分。Shell作为字符串处理起家的脚本语言,其数值计算有着独特的语法规则和陷阱。本文将彻底解析三种主流算术运算方式&#xff0c…...

OpenClaw版本升级:Qwen2.5-VL-7B兼容性测试与迁移指南

OpenClaw版本升级:Qwen2.5-VL-7B兼容性测试与迁移指南 1. 升级前的准备工作 上周我在本地开发环境遇到了一个棘手问题——现有的OpenClaw版本无法正确调用新部署的Qwen2.5-VL-7B多模态模型。这促使我开始了这次版本升级之旅,过程中积累了不少实战经验想…...

从沙漏到矿机:聊聊离散元法DEM是怎么‘算’出颗粒世界的(附Rocky/EDEM软件对比与学习资源)

从沙漏到矿机:离散元法DEM如何重构颗粒世界的数字镜像 沙漏里的细沙流淌时,每一粒沙子都在重力和碰撞中演绎着独特的运动轨迹。这种看似简单的物理现象背后,隐藏着一个复杂的多体动力学问题——如何精确描述成千上万颗粒之间的相互作用&#…...

解码AMD EPYC CPU命名规则:从数字到性能的全面解析

1. AMD EPYC CPU命名规则入门指南 第一次看到AMD EPYC处理器的型号时,我完全被那一串数字字母搞懵了。EPYC 7763、EPYC 75F3、EPYC 7313P...这些看似随机的组合其实藏着重要信息。就像汽车型号能看出排量和配置一样,EPYC的命名规则也能让我们快速判断处理…...

CLIP-GmP-ViT-L-14从零开始:国产昇腾910B芯片ACL适配部署实践

CLIP-GmP-ViT-L-14从零开始:国产昇腾910B芯片ACL适配部署实践 1. 项目概述 CLIP-GmP-ViT-L-14是一个经过几何参数化(GmP)微调的CLIP模型,在ImageNet和ObjectNet数据集上达到了约90%的准确率。这个模型结合了视觉和语言理解能力,能够计算图像…...

Jetson Nano 平台YOLO目标检测优化详细设计方案

Jetson Nano 平台YOLO目标检测优化详细设计方案 1. 项目概况与设计目标 Jetson Nano 作为 NVIDIA 推出的入门级边缘 AI 计算平台,虽然在计算能力上相比高端 GPU有所限制,但在功耗控制和成本效益方面表现优异,特别适合对功耗敏感的边缘部署场景…...

Wan2.2-I2V-A14B镜像免配置:内置模型权重42GB,节省下载与校验时间

Wan2.2-I2V-A14B镜像免配置:内置模型权重42GB,节省下载与校验时间 1. 镜像概述与核心优势 Wan2.2-I2V-A14B是一款专为文生视频任务优化的私有部署镜像,针对RTX 4090D 24GB显存显卡进行了深度优化。这个镜像最大的特点是内置了完整的42GB模型…...

嵌入式轻量级RPC框架:串口远程调用与调试技术

1. RPC库技术解析:面向嵌入式系统的轻量级远程过程调用框架1.1 设计背景与工程定位RPC(Remote Procedure Call)在嵌入式系统中并非传统服务器场景下的高吞吐通信协议,而是一种面向调试、配置与现场维护的低带宽、高语义、强交互性…...

LightOnOCR-2-1B作品分享:多语言识别效果实测,支持中日英法等

LightOnOCR-2-1B作品分享:多语言识别效果实测,支持中日英法等 1. 引言:多语言OCR的现实需求 在全球化的商业环境中,企业每天需要处理来自不同国家的文档、票据和表单。传统OCR工具往往面临两大挑战:一是对多语言混合…...

【SAP CO】3.产品成本-4.Costing Sheet成本核算单

目录 一、 Costing Sheet成本核算单简介 二、定义Calculation Bases计算基准 三、定义Overhead Rates间接费用率 四、定义Credits贷方 五、定义Costing Sheet成本核算单 一、 Costing Sheet成本核算单简介 库房、质量控制等成本中心,虽然没有直接参加生产&…...

从平面到立体:用Origin打造揭示乳液配方奥秘的3D三元曲面图

1. 为什么需要从平面走向立体? 在乳液配方研发过程中,我们常常需要同时调整三种成分的配比。传统的三元等高线图虽然能展示成分与性能的关系,但就像看一张纸质地图和用手机导航的区别——前者只能告诉你哪里有山,后者却能让你直观…...

我们如何同步 .NET 的虚拟单体仓库(二)账

在之前的文章中,我们花了大量的篇幅,从记录后端pod真实ip开始说起,然后引入envoy,再解决了各种各样的需求:配置自动重载、流量劫持、sidecar自动注入,到envoy的各种能力:熔断、流控、分流、透明…...

人工智能通识课:Pandas 基础

在学习 Pandas 时,初学者最容易遇到的困难,并不是某个函数不会写,而是不清楚这些函数在整个数据处理流程中各自承担什么任务。如果将 Pandas 仅理解为分散的 API,知识点容易显得零碎;如果将其放回真实任务链中&#xf…...

高效备战2026年上海初中古诗文大会【多选题】:背熟这份高频考点

今天距离2026年上海初中古诗文大会启动还有2个多月(通常6月底7月初启动,发布比赛方案和流程),正式比赛还有5个多月(通常10月初开始,分为初选、复选、决选三轮)。现在就读五年级到八年级的上海的…...

有限状态机进阶指南:5个HFSM设计模式解决复杂业务逻辑

有限状态机进阶指南:5个HFSM设计模式解决复杂业务逻辑 在物联网设备控制系统中,一个智能恒温器的状态管理曾让我头疼不已——它需要同时处理温度调节模式(制冷/制热/自动)、风速档位(高/中/低)、节能状态&a…...

OpenClaw故障排查大全:千问3.5-27B接口连接7类错误解决

OpenClaw故障排查大全:千问3.5-27B接口连接7类错误解决 1. 为什么需要这份排查指南 上周我在本地部署千问3.5-27B模型时,OpenClaw死活连不上模型接口。那天晚上我对着ECONNREFUSED错误折腾到凌晨两点,试了各种方法才发现是网关端口被占用了…...

MIT AI工具一分钟预览高度逼真3D打印成品外观,所见即所得

从电影道具到医疗设备,3D打印正在快速改变我们制造功能原型的方式。然而,大多数打印软件生成的预览只关注结构路径,忽略了颜色、光泽、纹理等外观要素,导致用户常常需要反复试印。根据3D科学谷的市场观察,MIT和普林斯顿…...

【PyCon 2025闭门分享精要】:Python 3.14 JIT底层调度器深度调优——用3行代码撬动47% CPU利用率提升

第一章:Python 3.14 JIT编译器性能调优配置总览Python 3.14 引入了实验性内置 JIT(Just-In-Time)编译器,基于 Pyston 的优化后端重构,支持函数级动态编译与类型特化。该 JIT 默认处于禁用状态,需通过环境变…...

**为生命按下“刷新键”:当细胞科技成为健康管理的新日常**

清晨六点半,张教授在太湖边完成了他的五公里慢跑。这位年近六十的物理学博导,面色红润,步伐稳健,让许多年轻同事都自叹不如。朋友们常打趣问他保养秘诀,他总是笑笑说:“不过是尊重科学,提前管理…...

spring-ai 第六模型介绍-聊天模型

spring-ai 第六模型介绍-聊天模型 官网 源码示例 spring-ai 第六模型介绍-聊天模型 官网 利用了预训练的语言模型,例如 GPT(生成型预训练变换器),以在自然语言中生成类似人类的响应 spring-ai网址【https://docs.spring.io/spri…...

pytorch基础入门day01

对pytorch的张量创建:#张量:与numpy相似(tensor) # 分为维度,形状,数据类型# 张量的创建 import torch# 创建一个2*3的全0张量 atorch.zeros(2,3) print(a)# one torch btorch.ones(2,3)# random torch ctorch.randn(2,3)# 从numpy中创建张量 import numpy as np n…...

Claude Code 权限 / 安全审查调用流程图

Claude Code 权限 / 安全审查调用流程图 这份文档的目标不是“介绍功能”,而是帮助你 复刻 Claude Code 的权限判定链路 到你们自己的手机 Agent 里。 重点回答 4 个问题: 一个 action 从模型产生到真正执行,中间经过了哪些关卡? 哪些地方是 确定性规则,哪些地方会 请求…...

智慧农业草莓成熟度识别 基于cnn的YOLOv11深度学习 智慧农业草莓成熟度目标检测系统 草莓识别系统(数据集使用 YOLOv11 进行草莓成熟度计数与检测 注意:此模块是在以下资源的+模型+界面)

使用 YOLOv11 进行草莓成熟度计数与检测 注意:此模块是在以下资源的帮助下完成的:Detection_image.png1. 代码库中每个 Notebook 的说明Dataset split NB: 此 Notebook 用于将原始的 3000 张图片按 0.8、0.1 和 0.1 的比例分为训练集、验证集和测试集。N…...

OpenClaw日志分析:千问3.5-35B-A3B-FP8任务执行效率优化

OpenClaw日志分析:千问3.5-35B-A3B-FP8任务执行效率优化 1. 为什么需要关注OpenClaw的任务执行效率 上周我在本地部署了OpenClaw,并接入千问3.5-35B-A3B-FP8模型进行自动化任务测试。最初几天运行还算顺利,但随着任务复杂度增加&#xff0c…...

半监督3D医学图像分割(四):URPC在鼻咽癌GTV分割中的高效应用

1. 为什么URPC在鼻咽癌GTV分割中表现突出 鼻咽癌肿瘤靶区(GTV)分割是放疗规划中的关键步骤,传统方法依赖医生手动勾画,耗时且易受主观影响。URPC(Uncertainty Rectified Pyramid Consistency)作为半监督3D医…...

单细胞测序实战:从原始数据到高质量细胞图谱的R/Seurat预处理全流程

1. 单细胞测序入门:为什么预处理如此重要? 第一次接触单细胞测序数据时,我盯着电脑屏幕上密密麻麻的基因表达矩阵发愣——这堆数字怎么就能变成漂亮的UMAP聚类图?后来才明白,数据预处理就是搭建这座桥梁的关键工序。简…...

保姆级教程:用PyTorch 1.13+全卷积网络搞定MSTAR SAR图像分类(附完整代码)

从零构建PyTorch全卷积网络实现MSTAR SAR图像分类实战指南 当第一次接触MSTAR数据集时,很多开发者会被其特殊的灰度SAR图像特性所困扰。与常规RGB图像不同,SAR图像具有独特的散射特性和成像机制,这给传统计算机视觉方法带来了挑战。本文将带你…...

ComfyUI实战:Qwen-Image三大ControlNet方案深度评测与选型指南

1. Qwen-Image ControlNet方案全景概览 第一次在ComfyUI里看到Qwen-Image的ControlNet选项时,我对着三套方案发了半小时呆——就像站在自助餐厅里面对琳琅满目的菜品,每样都想尝却不知从哪下手。经过两周的密集测试,终于摸清了这些方案的脾性…...

避坑指南:MediaPipe安装常见报错解决方案(附虚拟环境配置技巧)

MediaPipe实战避坑手册:从环境配置到高效开发的完整指南 在计算机视觉和机器学习领域,MediaPipe作为Google开源的多媒体处理框架,因其强大的实时感知能力和跨平台特性而备受开发者青睐。然而,许多开发者在初次接触MediaPipe时&…...

存算分离,性能跃升:实现查询效率再提升60%

概述 盖雅在腾讯云 TCHouse-D 2.0 基础上无缝升级至 3.0 版本,依托其全新存算分离架构、软硬结合的资源隔离能力与优化的查询引擎,实现了数仓性能与运维效率的双重飞跃。通过原生支持的弹性资源调度,精准匹配月结等高并发峰值需求&#xff0…...