Linux-Shell算术运算

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

双括号$((...))

特点如下:

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

基本运算示例如下

bash 复制代码
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)

自增运算示例

bash 复制代码
count=10
echo "原始值: $count"

# 变量自增 (后置)
echo $((count++)) # 输出 10 (先输出,再加 1)
echo "自增后: $count"   # 输出 11

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

赋值运算示例

bash 复制代码
a=5
b=2

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

在循环和判断中使用示例

bash 复制代码
# 从 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中的内置命令,功能与 $((...)) 非常相似。它主要用于赋值和自增/自减场景。

命令的基本语法如下:

bash 复制代码
let "表达式"

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

特点如下:

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

示例如下:

bash 复制代码
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的默认行为)

bash 复制代码
echo "10 + 5" | bc # 输出 15

浮点数运算

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

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

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

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

bash 复制代码
# 定义 pi 的近似值和半径
pi_value=3.14159
radius=2.5

# 计算圆的面积,并将结果存入变量 area
area=$(bc <<< "scale=2;$pi_value * $radius *$radius")
echo "圆的面积是: $area" # 输出圆的面积是: 19.63

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

bash 复制代码
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 ================================

相关推荐
蜡笔婧萱14 小时前
Linux--RHCE关于at和crond的第一次应用
linux·运维·服务器
VBsemi-专注于MOSFET研发定制14 小时前
高端LED封装自动化产线功率MOSFET选型方案——精密、高效与可靠驱动系统设计指南
运维·单片机·自动化
Agent手记14 小时前
生产节拍混乱,在制品积压严重该怎么破解?——2026制造业柔性生产与Agent自动化实战指南
运维·人工智能·ai·自动化
hjjdebug14 小时前
制作ubuntu usb安装盘 (用dd 命令)
linux·u盘·安装盘
小程同学>o<14 小时前
Linux 应用层开发入门(二十五)| 网络编程
linux·网络·嵌入式软件·嵌入式应用层·应用层开发·linux应用层开发
shughui14 小时前
2026最新JDK版本选择及下载安装详细图文教程【windows、mac附安装包】
java·linux·开发语言·windows·jdk·mac
霍格沃兹测试学院-小舟畅学14 小时前
我用一个自定义Skill,把UI自动化维护时间从4小时压到15分钟
运维·ui·自动化
сокол14 小时前
【网安-Web渗透测试-内网渗透】内网信息收集(工具)
服务器·windows·网络安全·系统安全
D4c-lovetrain14 小时前
Linux个人心得28(k8s实战)
linux·运维·kubernetes
Mr.456715 小时前
CentOS 7 完整部署开源 MQTT 服务器 EMQX 指南(2025实战版)
服务器·开源·centos