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

相关推荐
随便做点啥7 分钟前
32卡×4090 24GB,Qwen3.8-27B-FP8 集群部署报告
服务器·经验分享·docker·vllm
Brilliantwxx16 分钟前
313131
服务器
迪康coolmu28 分钟前
企业文件外发防泄漏实践:从通道封堵到三层全链路管控
大数据·运维·网络·人工智能·安全·阿里云
comedate8 小时前
Windows / Linux GPU 虚拟内存布局差异与 CUDA 越界访问行为
linux·windows·mmu·cuda 越界访问
暴力求解10 小时前
Linux网络---传输层协议TCP(二)
linux·服务器·开发语言·网络·tcp/ip
JoyCong199810 小时前
ToDesk个人版、专业版、游戏版、设计版、性能版、团队版权益介绍
大数据·运维·游戏·远程工作·远程操作
ltl11 小时前
序列化格式深度对比:Protobuf、FlatBuffers、Cap’n Proto
linux
lengjingzju11 小时前
编译与调试完全指南—第17章 总结
linux
ltl11 小时前
容器网络性能真相:veth vs macvlan vs eBPF 数据面
linux
Elastic 中国社区官方博客12 小时前
ES95:面向 Elasticsearch 时间序列指标的自适应压缩
大数据·运维·elasticsearch·搜索引擎·架构·全文检索