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 ================================

相关推荐
lzx_00210 小时前
Linux 进程(三) 从进程状态到僵尸进程、孤儿进程
linux·服务器
FlightYe11 小时前
音视频修炼之容器与协议(四):RTSP详解
android·linux·ffmpeg·音视频·dash
刘马想放假12 小时前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
kloc14 小时前
聊天室项目入口网关子服务的实现
linux·c++
GeW14 小时前
深圳APEC峰会倒计时:数据库与Linux运维的"隐形考场"
linux
梦到啥说啥15 小时前
Linux网络编程:UDP网络协议
linux·网络协议·udp
无足鸟ICT16 小时前
【RHCA+】ipcrm命令(删除IPC资源)
linux
星恒随风17 小时前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
Z21-X18 小时前
云原生运维学习笔记:ECShop全链路容器化部署与Docker底层资源隔离深度剖析
运维·笔记·学习·云原生
陈希12320 小时前
Linux 网络诊断工具实战:ping、curl、tcpdump、mtr、dig 用法详解
linux·网络·tcpdump