bash脚本----变量的算术运算

ops/2025/2/27 12:21:45/
  • 整数运算:推荐使用 $((...))((...)),因为它们是现代 Bash 的标准语法,效率高且语法简洁。

  • 浮点运算:可以使用 bcawk,具体选择取决于你的需求和偏好。

  • 兼容性:如果需要兼容 POSIX 标准,可以使用 expr,但尽量避免在现代脚本中使用。

特性

NUM=$((NUM - 1))NUM=$(expr $NUM - 1)
效率高(内部解析)低(调用外部命令)
语法复杂性简单,支持复杂表达式严格,运算符和操作数之间必须有空格
兼容性现代 Bash 和 Zsh 支持POSIX 标准,几乎所有 Unix-like 系统
功能支持复杂算术运算仅支持简单算术和字符串操作

1. 使用 $((...)) 进行算术运算

$((...)) 是 Bash 中最常用的算术运算语法,它可以直接在脚本中进行整数运算,支持加、减、乘、除、取模等操作。

语法:result=$((expression))  

在 Bash 脚本中,变量赋值操作的语法非常严格,尤其是等号(=)周围的空格规则。对于变量赋值操作,等号前后不能有空格,否则会导致语法错误。

bash">a=10
b=3
sum=$((a + b))                 # 加法
difference=$((a - b))          # 减法
product=$((a * b))             # 乘法
quotient=$((a / b))            # 除法(整数除法)
remainder=$((a % b))           # 取模echo "Sum: $sum"               # 输出 13
echo "Difference: $difference" # 输出 7
echo "Product: $product"       # 输出 30
echo "Quotient: $quotient"     # 输出 3
echo "Remainder: $remainder"   # 输出 1

2. 使用 ((...)) 语法

((...)) 是一种更灵活的算术运算语法,它可以直接在表达式中使用变量,而无需 $ 符号。此外,它还支持更复杂的表达式和条件判断。

语法:((expression)) 

bash">a=10
b=3
((sum = a + b))
((difference = a - b))
((product = a * b))
((quotient = a / b))
((remainder = a % b))echo "Sum: $sum"               # 输出 13
echo "Difference: $difference" # 输出 7
echo "Product: $product"       # 输出 30
echo "Quotient: $quotient"     # 输出 3
echo "Remainder: $remainder"   # 输出 1
  • ((...)) 支持直接对变量赋值,而 $((...)) 只能用于计算表达式的值。

  • ((...)) 支持更复杂的表达式,例如:

    bash">((result = (a + b) * c))

3. 使用 let 命令

let 命令也可以用于执行算术运算,它支持对变量的直接赋值和操作。

语法:let  "variable=expression"

bash">let "a=10"
let "b=3"
let "sum=a+b"
let "difference=a-b"
let "product=a*b"
let "quotient=a/b"
let "remainder=a%b"echo "Sum: $sum"               # 输出 13
echo "Difference: $difference" # 输出 7
echo "Product: $product"       # 输出 30
echo "Quotient: $quotient"     # 输出 3
echo "Remainder: $remainder"   # 输出 1

4. 使用外部命令 expr

虽然现代 Bash 中不推荐使用 expr,但它仍然是一种可行的算术运算方法,尤其是在需要兼容 POSIX 标准时。

语法:result=$(expr expression)

bash">a=10
b=3
sum=$(expr $a + $b)            # 加法
difference=$(expr $a - $b)     # 减法
product=$(expr $a \* $b)       # 乘法(注意:乘法需要转义 `\*`)
quotient=$(expr $a / $b)       # 除法
remainder=$(expr $a % $b)      # 取模echo "Sum: $sum"               # 输出 13
echo "Difference: $difference" # 输出 7
echo "Product: $product"       # 输出 30
echo "Quotient: $quotient"     # 输出 3
echo "Remainder: $remainder"   # 输出 1

5. 浮点运算

Bash 默认不支持浮点运算,但可以通过以下方法实现:

方法 1:使用 bc(Bash Calculator)

bc 是一个强大的计算器工具,支持浮点运算。

语法:result=$(echo "scale=2; expression" | bc)

  • scalebc 中用于控制浮点运算的精度。

  • 默认情况下,scale=0,结果会被截断为整数。

  • 通过设置 scale=<number>,可以指定结果保留的小数位数。

  • scale 的值必须是非负整数。

bash">a=10
b=3
sum=$(echo "$a + $b" | bc)               # 加法
difference=$(echo "$a - $b" | bc)        # 减法
product=$(echo "$a * $b" | bc)           # 乘法
quotient=$(echo "scale=2; $a / $b" | bc) # 除法(保留两位小数)echo "Sum: $sum"                         # 输出 13
echo "Difference: $difference"           # 输出 7
echo "Product: $product"                 # 输出 30
echo "Quotient: $quotient"               # 输出 3.33
方法 2:使用 awk

awk 也可以用于浮点运算,awk是一种非常强大的文本处理工具,广泛用于数据处理、文本分析和格式化输出。

语法:result=$(awk "BEGIN {print expression}")

  • BEGIN:在处理任何输入之前执行的代码块,适合初始化和简单输出。在处理任何输入之前,直接执行 {print expression}

  • print:awk中的一个内置函数,用于输出内容到标准输出。

  • $(...):捕获命令的输出,并将其赋值给变量。

bash">a=10
b=3
sum=$(awk "BEGIN {print $a + $b}")                 # 加法
difference=$(awk "BEGIN {print $a - $b}")          # 减法
product=$(awk "BEGIN {print $a * $b}")             # 乘法
quotient=$(awk "BEGIN {printf \"%.2f\", $a / $b}") # 除法(保留两位小数)echo "Sum: $sum"               # 输出 13
echo "Difference: $difference" # 输出 7
echo "Product: $product"       # 输出 30
echo "Quotient: $quotient"     # 输出 3.33


http://www.ppmy.cn/ops/161670.html

相关文章

OpenCV(10):视频目标跟踪、视频背景减除

1 视频目标跟踪 在计算机视觉领域&#xff0c;视频目标跟踪是一个非常重要的任务。视频目标跟踪广泛应用于监控、自动驾驶、人机交互等多个领域。OpenCV 提供了多种目标跟踪算法&#xff0c;其中 MeanShift 和 CamShift 是两种经典且常用的算法。本文将详细讲解这两种算法的原理…

Git原理+使用(超详细)

Git初识 当我们写项目代码时&#xff0c;需要不断的更新版本&#xff0c;那么就需要一个东西去管理这些不同版本的文件—版本控制器。 目前最主流的版本控制器就是Git。它是一个可以记录工程的每一次改动和版本迭代的管理系统&#xff0c;同时方便多人协同作业。 &#xff0…

el-table

el-table合并 参考&#xff1a; https://www.jianshu.com/p/6067708bd1ee https://blog.csdn.net/weixin_43862642/article/details/122055745 某个列合并&#xff0c;前面序号也要跟着对应合并 <el-table:data"list":span-method"objectSpanMethod" …

协方差(Covariance)与得分函数:从Fisher信息矩阵看统计关联

协方差与得分函数&#xff1a;从Fisher信息矩阵看统计关联 协方差&#xff08;Covariance&#xff09;是统计学中一个基础但强大的概念&#xff0c;它描述了两个随机变量之间的关系。在Fisher信息矩阵中&#xff0c;协方差以一种特别的形式出现&#xff1a;得分函数的协方差。…

Spring Boot 项目中如何在 `pom.xml` 文件中引入本地 JAR 包

文章目录 Spring Boot 项目中如何在 pom.xml 文件中引入本地 JAR 包1. 准备工作2. 将本地 JAR 包安装到本地 Maven 仓库2.1 使用 mvn install:install-file 命令2.2 验证安装 3. 在 pom.xml 中引入本地 JAR 包3.1 添加依赖3.2 完整示例 4. 使用 system 作用域引入本地 JAR 包&a…

开源一款DDS信号发生扩展板-FreakStudio多米诺系列

原文链接&#xff1a; FreakStudio的博客 摘要 信号发生扩展板通过SPI接口生成可调频率和幅度的正弦波、方波和三角波&#xff0c;频率小于1MHz。支持幅度调节&#xff0c;提供原始和6倍放大输出接口。配备5阶低通滤波器、噪声抑制功能&#xff0c;优化信号稳定性。 往期推…

普中单片机-51TFT-LCD显示屏(1.8寸 STM32)

普中官方论坛&#xff1a; http://www.prechin.cn/gongsixinwen/208.html 普中科技-各型号开发板资料链接&#xff1a;https://www.bilibili.com/read/cv23681775/?spm_id_from333.999.0.0 27-TFTLCD显示实验_哔哩哔哩_bilibili 2.程序烧录 2.1设置彩屏驱动 3.实验效果

捌拾- 量子态层析 以及 布洛赫球 (1)

1. 奥卡姆剃刀 在上一篇学习文章中 柒拾玖- 贝尔不等式 &#xff0c;我感觉&#xff0c;为啥这么量子计算的门槛那么高呢&#xff1f; 结果我打开了上级目录&#xff0c;发现&#xff0c;原来他是按首字母排序… 经过一系列查看&#xff0c;我挑了一个最简单的 量子态层析 …