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

Linux-Shell算术运算

在 Shell 中,变量默认都是字符串类型的。要进行算术运算,你必须使用特定的语法来告诉 Shell:“这里我不是要拼接字符串,而是要进行数学计算”。

双括号$((...))

特点如下:

  • 只能进行整数运算,不支持小数浮点数的运算
  • 变量引用无需使用$符号,在双括号内部引用变量时,可以省略$符号
  • 支持常见运算符:
+, -, *, /(除法,结果为整数) %(取余) **(幂运算) ++, --(自增,自减,前置和后置都支持) &, |, ^, ~, <<, >>(按位与、或、异或、非、左移、右移) &&, ||, !(逻辑与、或、非)
  • 支持赋值,可以在括号内进行赋值操作

基本运算示例如下

a=10 b=5 # 加法 echo $((a + b)) # 输出 15 # 减法 echo $((a - b)) # 输出 5 # multiplication (乘法,用 * 表示,避免与通配符混淆) echo $((a * b)) # 输出 50 # 除法(结果为整数) echo $((a / b)) # 输出 2 # 取余 echo $((a % b)) # 输出 0 (10 除以 5 余 0) echo $((11 % b)) # 输出 1 (11 除以 5 余 1)

自增运算示例

count=10 echo "原始值: $count" # 变量自增 (后置) echo $((count++)) # 输出 10 (先输出,再加 1) echo "自增后: $count" # 输出 11 # 变量自减 (前置) echo $((--count)) # 先减 1,再输出 (11-1=10) echo "自减后: $count" # 输出 10

赋值运算示例

a=5 b=2 ((a = a * b + 10)) # 等价于 a=$((a * b + 10)) echo $a # 输出 20 (5 * 2 + 10 = 20)

在循环和判断中使用示例

# 从 1 加到 10 sum=0 for ((i=1; i<=10; i++)); do ((sum += i)) # ((sum = sum + i)) 的简写 done echo "1到10的和是: $sum" # 输出 55

let命令

let命令也是shell中的内置命令,功能与 $((...)) 非常相似。它主要用于赋值和自增/自减场景。

命令的基本语法如下:

let "表达式"

表达式中的变量需要 $ 符号,并且整个表达式需要用双引号括起来。
特点如下:

  • 同样只支持整数运算。
  • 语法稍微繁琐,不如 $((...)) 简洁。
  • let 通常用于对变量进行直接赋值。

示例如下:

a=10 b=5 # 加法,需要 "" let "sum = a + b" echo $sum # 输出 15 # 自增 let "a++" echo$a # 输出 11 #复杂的赋值 let "square = a * a" echo $square # 输出 121 (11 * 11)

bc命令(浮点运算王者)

上面介绍的方式都只是进行整数运算,如果需要进行浮点数运算,shell中内置了bc命令可以帮你实现。bc (Basic Calculator) 是你的不二之选。它是一个强大的命令行计算器。

整数运算(bc的默认行为)

echo "10 + 5" | bc # 输出 15

浮点数运算

要通过 bc 进行浮点运算,需要设置 scale 变量来定义小数点位数。

# 计算 10 除以 3,保留 4 位小数 # `echo -e` 用于正确解释 \n 字符 echo -e "scale=4\n10 / 3" | bc # 输出 3.3333

如何在脚本中使用bc命令?

上面的示例中也看到了可以通过管道符传递个bc进行算术运算,更好的方式是使用 <<< (Here String) 来将数据传递给 bc,避免使用管道符。

# 定义 pi 的近似值和半径 pi_value=3.14159 radius=2.5 # 计算圆的面积,并将结果存入变量 area area=$(bc <<< "scale=2;$pi_value * $radius *$radius") echo "圆的面积是: $area" # 输出圆的面积是: 19.63

直接在脚本中进行浮点数运算是不行的,只能借助bc命令。下面是一个很好的示例

a=1.5 b=2.3 c=10 # 1. 构造表达式字符串 expr_str="$a +$b" # 2. 使用 bc 计算 a + b 的结果 # `printf` 用于格式化输出并去除多余的空行和0 sum=$(printf "%.4f\n"$(echo "scale=4; $expr_str" | bc)) # 3. 将新的结果与 c 相乘 final_result=$(bc <<< "scale=2; $sum *$c") # 4. 输出最终结果 echo "最终结果是: $final_result" # 输出 最终结果是: 38.00

================================ The END ================================

http://www.jsqmd.com/news/609907/

相关文章:

  • FastAPI单元测试实战:别等上线被喷才后悔,TestClient用对了真香!盒
  • (论文速读)基于信号-图像映射和深度Gabor卷积自适应池化网络的旋转机械智能故障诊断方法
  • Java学习笔记_Day22
  • AKConv卷积模块深度评测:在YOLOv8n/s/m/l/x全系列模型上的涨点效果与推理速度实测
  • 5分钟上手libhv:用自带httpd和curl工具快速搭建本地测试服务
  • 锅炉智能控制系统:西门子PLC与昆仑触摸屏协同工作,CAD电气图纸指导下的技术实现
  • 【UE5】数字人实战:从动捕到物理发型的全链路搭建
  • MyString类的常见面试问题
  • 破解GitHub访问难题:Fast-GitHub 3大核心引擎实现开源项目访问加速
  • Claude Code fileHistory 文件编辑快照与回滚机制深度解析
  • Python 数据处理封神篇:CSV+JSON 全解析,从入门到天气 API 实战
  • 别再只用threshold了!Halcon二值化8大算子保姆级对比(附实战避坑指南)
  • 六种AI驱动的文献引用生成策略在学术研究中的高效应用
  • 【信息科学与工程学】【管理科学】第十六篇 利益设计与分配:从静态薪酬到动态激励生态系统的工程化重构
  • 面向法律文书 Agent 的 Harness 条款冲突检测
  • HJ168 小红的字符串
  • Kali+PHPStudy搭建红日靶场:那些教程里没提的玄学问题解决方案
  • 状态对写题很重要
  • React倒计时终极方案:时间对齐+面试必考
  • 【RWA 机制,ERC-4626,ERC-3643,ERC-7540,ERC-7575,LayerZero】
  • 2026降AI率工具实测:SpeedAI科研小助手为什么是首选?
  • 小红书合规引流新姿势:聚光平台落地页卡片制作全流程指南
  • 40岁程序员未裸辞!AI赋能后,我的月薪从6k涨到6.07万,行业真相曝光!
  • 阿姆智创15.6寸工控电脑一体机,源头工厂ODM定制方案,赋能工业产线与机器视觉设备场景
  • 编译即优化:Cuvil在Llama-3-8B本地推理中的延迟压降至127ms,你还在用原生torch.compile?
  • Python数据分析如何重置索引_Pandas的reset_index应用
  • 计算机毕业设计:Python全国空气质量与气象监测平台 Flask框架 可视化 数据分析 机器学习 天气 深度学习 AI 空气质量分析(建议收藏)✅
  • 深入解析MCU:从哈佛架构到智能家居应用
  • 深度可分离卷积
  • CC2530开发入门:用IAR EW8051和SmartRF Flash Programmer烧录第一个Zigbee程序