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

Shell脚本-四则运算符号

一、前言

在 Linux Shell 脚本编程中,我们经常需要对数值进行计算,例如:计数器累加、文件大小比较、资源使用率计算等。虽然 Shell 本身不是一种强类型的编程语言,但它提供了多种方式进行四则运算(加、减、乘、除、取模)。

本文将带你全面了解 Shell 脚本中常用的 四则运算符号及其使用方法,包括整数运算、浮点数运算、不同语法格式的对比,并通过实际代码示例帮助你掌握这些核心技能。

二、Shell 中的四则运算符概览

运算符含义示例
+加法a + b
-减法a - b
*乘法a * b
/除法(整除)a / b
%取模(求余)a % b

⚠️ 注意:Shell 原生仅支持整数运算,浮点运算需借助外部命令如 bcawk

三、整数运算的常用方法

✅ 方法1:使用 $(( ... )) —— 推荐方式

这是最常用、最简洁的整数运算方式。

#!/bin/basha=10
b=3echo $(( a + b ))   # 输出: 13
echo $(( a - b ))   # 输出: 7
echo $(( a * b ))   # 输出: 30
echo $(( a / b ))   # 输出: 3 (整除)
echo $(( a % b ))   # 输出: 1 (余数)

✅ 优点:

  • 语法简洁
  • 支持嵌套和复杂表达式
  • 性能高

✅ 方法2:使用 let 命令

let 命令用于执行算术表达式赋值。

#!/bin/basha=10
b=3let "sum = a + b"
let "diff = a - b"
let "prod = a * b"
let "div = a / b"echo $sum   # 输出: 13
echo $div   # 输出: 3

⚠️ 注意:let 不支持浮点数,且表达式中不能有空格(除非用引号包围)。

✅ 方法3:使用 expr 命令

expr 是一个外部命令,用于求值表达式。

#!/bin/basha=10
b=3expr $a + $b      # 输出: 13
expr $a - $b      # 输出: 7
expr $a \* $b     # 注意:* 需要转义
expr $a / $b      # 输出: 3
expr $a % $b      # 输出: 1

⚠️ 注意事项:

  • 操作符两边必须有空格
  • * 必须写成 \*,否则会被 shell 解释为通配符
  • 性能较低,不推荐用于复杂运算

四、浮点数运算(支持小数)

Shell 原生不支持浮点运算,需借助外部工具。

✅ 使用 bc 命令(推荐)

bc 是 Linux 下强大的任意精度计算器语言。

#!/bin/basha=10.5
b=3.2# 加法
result=$(echo "$a + $b" | bc)
echo $result  # 输出: 13.7# 乘法(保留2位小数)
result=$(echo "scale=2; $a * $b" | bc)
echo $result  # 输出: 33.60# 除法(保留3位小数)
result=$(echo "scale=3; $a / $b" | bc)
echo $result  # 输出: 3.281

scale=N 表示保留 N 位小数。

✅ 使用 awk 命令(灵活强大)

awk 也可用于浮点运算,特别适合在管道中处理数据。

#!/bin/basha=10.5
b=3.2result=$(awk "BEGIN {print $a + $b}")
echo $result  # 输出: 13.7result=$(awk "BEGIN {printf \"%.2f\", $a * $b}")
echo $result  # 输出: 33.60

五、实际应用场景示例

✅ 场景1:计算磁盘使用率

#!/bin/bashtotal=$(df / | tail -1 | awk '{print $2}')
used=$(df / | tail -1 | awk '{print $3}')# 使用 bc 计算百分比
usage=$(echo "scale=2; $used * 100 / $total" | bc)
echo "磁盘使用率: ${usage}%"

✅ 场景2:循环计数器

#!/bin/bashcount=0
for i in {1..5}; dolet "count += i"
done
echo "总和: $count"  # 输出: 15

✅ 场景3:判断奇偶数

#!/bin/bashnum=7
if (( num % 2 == 0 )); thenecho "$num 是偶数"
elseecho "$num 是奇数"
fi

六、运算符优先级(参考)

优先级运算符说明
1()括号
2* / %乘、除、取模
3+ -加、减
4=赋值

示例:

echo $(( 2 + 3 * 4 ))  # 输出: 14
echo $(( (2 + 3) * 4 )) # 输出: 20

七、常见错误与注意事项

错误正确做法说明
echo $a*$becho $(($a * $b))* 会被 shell 当作通配符
(( 3.5 + 2 ))使用 bcShell 不支持浮点运算
let a = b + clet "a = b + c"let 中表达式需加引号或无空格
忘记赋值result=$((a + b))运算结果需赋值给变量才能使用

八、总结对比表

方法支持整数支持浮点是否推荐适用场景
$(( ... ))✅ 推荐整数运算、条件判断
let变量自增、循环计数
expr⚠️ 一般简单表达式(兼容旧脚本)
bc✅ 推荐浮点运算、科学计算
awk✅ 推荐数据处理、格式化输出

九、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

http://www.lryc.cn/news/616096.html

相关文章:

  • spring-boot-starter-data-redis 与 org.redisson 区别 联系
  • Shell脚本-数组定义
  • 数据结构:栈和队列(Stack Queue)基本概念与应用
  • 从0开始的中后台管理系统-5(userList页面功能实现)
  • JS数组排序算法
  • 第三章 向量
  • ECharts Y轴5等分终极解决方案 - 动态适配缩放场景
  • 计算机网络:(十四)传输层(下)详细讲解TCP报文段的首部格式,TCP 可靠传输的实现与TCP 的流量控制
  • 一些js数组去重的实现算法
  • Android的事件分发流程、Kotlin协程、4大组件、Handler机制、架构设计、性能优化、内存泄漏
  • 系统架构设计师备考之架构设计高级知识
  • Flink提交流程全解析:从模式到实践
  • DevOps:从GitLab .gitlab-ci.yml 配置文件到CI/CD
  • [论文阅读] 人工智能 + 软件工程 | 大型语言模型对决传统方法:多语言漏洞修复能力大比拼
  • FlinkSQL Joins全解析
  • 从MySQL到大数据平台:基于Spark的离线分析实战指南
  • Spark学习(Pyspark)
  • 在VMware中安装统信UOS桌面专业版
  • 可视化程序设计(4) - 第一个图形窗口程序
  • Python元组
  • 计算XGBoost分类模型的错误率
  • Qt 框架全面解析:从基础到应用
  • 基于C语言(兼容C++17编译器)的记账系统实现
  • CompletableFuture实现Excel sheet页导出
  • RabbitMQ面试精讲 Day 19:网络调优与连接池管理
  • GitHub上为什么采用Gradle编译要多于Maven
  • Excel合并同步工具V1.0
  • Pytorch深度学习框架实战教程10:Pytorch模型保存详解和指南
  • Spring Boot集成WebSocket
  • Spring Boot与WebSocket构建物联网实时通信系统