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

相关推荐
用户0328472220701 天前
如何搭建本地yum源(上)
运维
A小辣椒2 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao3 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务