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