掘金 后端 ( ) • 2024-06-14 18:36

在日常的 Shell 脚本编写中,我们经常会遇到需要进行数学计算的场景。相较于其他编程语言直接支持算数运算,Shell 本身并不直接支持复杂的数学计算,因为它并不如 Python 那样直接支持简单的数学表达式。

不过,别担心,通过本文,你将学会如何在 Shell 中灵活进行各种数学计算。

开始之前

在深入了解细节之前,有必要先了解,尽管 Shell 本身对数学运算的支持很有限,但我们可以通过一些特定的命令和运算方式来进行。有多种方法可以在 Shell 中进行数学运算,包括一些直接的运算器如 (())let,以及依赖于外部工具如 bc 的方式。

下面,我们讲解最常用的数学计算方式,并提供实际的代码示例。准备好开始你的 Shell 数学之旅了吗?

Shell 算术运算符

在深入示例之前,让我们先快速了解一下 Shell 支持的一些基本算术运算符及其含义。

算术运算符 说明/含义 +, - 加法(或正号)、减法(或负号) *, /, % 乘法、除法、取余(取模) ** 幂运算 ++, -- 自增和自减,可以放在变量的前面也可以放在变量的后面 !, &&, || 逻辑非(取反)、逻辑与(and)、逻辑或(or) <, <=, >, >= 比较符号(小于、小于等于、大于、大于等于) ==, !=, = 比较符号(相等、不相等;对于字符串,= 也可以表示相当于) <<, >> 向左移位、向右移位 ~, |, &, ^ 按位取反、按位或、按位与、按位异或 =, +=, -=, *=, /=, %= 赋值运算符

Shell 中的数学计算方式

shell 中常用的六种数学计算方式:

运算操作符/运算命令 说明 (( )) 用于整数运算,效率很高,推荐使用。但是只能进行整数运算,不能对小数或者字符串进行计算。 let 用于整数运算,和 (()) 类似。 $[] 用于整数运算,不如 (()) 灵活。 expr 可用于整数运算,也可以处理字符串。比较麻烦,需要注意各种细节,不推荐使用。 bc Linux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计算小数就得使用 bc 这个外部的计算器。 declare -i 将变量定义为整数,然后再进行数学运算时就不会被当做字符串了。功能有限,仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算、自增自减等,所以在实际开发中很少使用。

(()) 可以用于整数计算,bc 可以用于小数计算,推荐只使用 (()) 和 bc 的方式进行运算

使用 (()) 进行整数运算

(( )) 是进行整数运算最推荐的方式,它不仅效率高,而且语法简洁。请注意,(( )) 只支持整数运算,不能用于小数或字符串。

下面通过一些实际的代码示例来展示 (()) 的使用方法:

#!/bin/bash

# 简单的数值运算
echo $((1+1))  # 输出 2

# 变量运算
i=3
((i*=2))  # 等同于 i=i*2,此时 i 的值变为 6
echo $i  # 输出 6

# 复合运算
((a=1+2**3-4%3))
echo $a  # 输出 8,展示了加法、幂运算和取模的组合使用

# 逻辑运算
echo $((3<6))  # 输出 1,1 表示真(true)
echo $((3>6))  # 输出 0,0 表示假(false)

# 自增和自减运算
c=10
echo $((c++))  # 输出 10,c 的值变为 11
echo $c  # 输出 11

# 多表达式运算
((a=3+5, b=a+10))
echo $a $b  # 先计算 a=3+5,然后 b=a+10;最终输出 8 18

这些例子体现了 (()) 在处理各种整数运算中的强大和灵活性。

使用 bc 进行小数计算

对于需要小数运算的场景,bc 是你的最佳选择。它是 Linux 下的一个高精度计算器程序,支持整数和小数运算。

# 使用 bc 进行小数加法
echo "scale=2; 3.14 + 2.86" | bc  # 输出 6.00

# 使用变量
a=5.75
b=4.25
result=$(echo "$a + $b" | bc)
echo $result  # 输出 10.00

bc 使用 scale 来定义小数点后的精度,这在进行小数运算时非常有用。

总结

虽然 Shell 本身对数学运算的支持有限,但通过 (())bc 等方式,我们可以有效地进行整数和小数的计算。

希望本文能帮助你在编写 Shell 脚本时,更加自如地处理数学运算问题。