-
整数运算:推荐使用
$((...))
或((...))
,因为它们是现代 Bash 的标准语法,效率高且语法简洁。 -
浮点运算:可以使用
bc
或awk
,具体选择取决于你的需求和偏好。 -
兼容性:如果需要兼容 POSIX 标准,可以使用
expr
,但尽量避免在现代脚本中使用。
特性 | NUM=$((NUM - 1)) | NUM=$(expr $NUM - 1) |
---|---|---|
效率 | 高(内部解析) | 低(调用外部命令) |
语法复杂性 | 简单,支持复杂表达式 | 严格,运算符和操作数之间必须有空格 |
兼容性 | 现代 Bash 和 Zsh 支持 | POSIX 标准,几乎所有 Unix-like 系统 |
功能 | 支持复杂算术运算 | 仅支持简单算术和字符串操作 |
1. 使用 $((...))
进行算术运算
$((...))
是 Bash 中最常用的算术运算语法,它可以直接在脚本中进行整数运算,支持加、减、乘、除、取模等操作。
语法:result=$((expression))
在 Bash 脚本中,变量赋值操作的语法非常严格,尤其是等号(=
)周围的空格规则。对于变量赋值操作,等号前后不能有空格,否则会导致语法错误。
bash">a=10
b=3
sum=$((a + b)) # 加法
difference=$((a - b)) # 减法
product=$((a * b)) # 乘法
quotient=$((a / b)) # 除法(整数除法)
remainder=$((a % b)) # 取模echo "Sum: $sum" # 输出 13
echo "Difference: $difference" # 输出 7
echo "Product: $product" # 输出 30
echo "Quotient: $quotient" # 输出 3
echo "Remainder: $remainder" # 输出 1
2. 使用 ((...))
语法
((...))
是一种更灵活的算术运算语法,它可以直接在表达式中使用变量,而无需 $
符号。此外,它还支持更复杂的表达式和条件判断。
语法:((expression))
bash">a=10
b=3
((sum = a + b))
((difference = a - b))
((product = a * b))
((quotient = a / b))
((remainder = a % b))echo "Sum: $sum" # 输出 13
echo "Difference: $difference" # 输出 7
echo "Product: $product" # 输出 30
echo "Quotient: $quotient" # 输出 3
echo "Remainder: $remainder" # 输出 1
-
((...))
支持直接对变量赋值,而$((...))
只能用于计算表达式的值。 -
((...))
支持更复杂的表达式,例如:bash">((result = (a + b) * c))
3. 使用 let
命令
let
命令也可以用于执行算术运算,它支持对变量的直接赋值和操作。
语法:let "variable=expression"
bash">let "a=10"
let "b=3"
let "sum=a+b"
let "difference=a-b"
let "product=a*b"
let "quotient=a/b"
let "remainder=a%b"echo "Sum: $sum" # 输出 13
echo "Difference: $difference" # 输出 7
echo "Product: $product" # 输出 30
echo "Quotient: $quotient" # 输出 3
echo "Remainder: $remainder" # 输出 1
4. 使用外部命令 expr
虽然现代 Bash 中不推荐使用 expr
,但它仍然是一种可行的算术运算方法,尤其是在需要兼容 POSIX 标准时。
语法:result=$(expr expression)
bash">a=10
b=3
sum=$(expr $a + $b) # 加法
difference=$(expr $a - $b) # 减法
product=$(expr $a \* $b) # 乘法(注意:乘法需要转义 `\*`)
quotient=$(expr $a / $b) # 除法
remainder=$(expr $a % $b) # 取模echo "Sum: $sum" # 输出 13
echo "Difference: $difference" # 输出 7
echo "Product: $product" # 输出 30
echo "Quotient: $quotient" # 输出 3
echo "Remainder: $remainder" # 输出 1
5. 浮点运算
Bash 默认不支持浮点运算,但可以通过以下方法实现:
方法 1:使用 bc
(Bash Calculator)
bc
是一个强大的计算器工具,支持浮点运算。
语法:result=$(echo "scale=2; expression" | bc)
-
scale
在bc
中用于控制浮点运算的精度。 -
默认情况下,
scale=0
,结果会被截断为整数。 -
通过设置
scale=<number>
,可以指定结果保留的小数位数。 -
scale
的值必须是非负整数。
bash">a=10
b=3
sum=$(echo "$a + $b" | bc) # 加法
difference=$(echo "$a - $b" | bc) # 减法
product=$(echo "$a * $b" | bc) # 乘法
quotient=$(echo "scale=2; $a / $b" | bc) # 除法(保留两位小数)echo "Sum: $sum" # 输出 13
echo "Difference: $difference" # 输出 7
echo "Product: $product" # 输出 30
echo "Quotient: $quotient" # 输出 3.33
方法 2:使用 awk
awk
也可以用于浮点运算,awk是一种非常强大的文本处理工具,广泛用于数据处理、文本分析和格式化输出。
语法:result=$(awk "BEGIN {print expression}")
-
BEGIN
:在处理任何输入之前执行的代码块,适合初始化和简单输出。在处理任何输入之前,直接执行{print expression}
。 -
print
:awk中的一个内置函数,用于输出内容到标准输出。 -
$(...)
:捕获命令的输出,并将其赋值给变量。
bash">a=10
b=3
sum=$(awk "BEGIN {print $a + $b}") # 加法
difference=$(awk "BEGIN {print $a - $b}") # 减法
product=$(awk "BEGIN {print $a * $b}") # 乘法
quotient=$(awk "BEGIN {printf \"%.2f\", $a / $b}") # 除法(保留两位小数)echo "Sum: $sum" # 输出 13
echo "Difference: $difference" # 输出 7
echo "Product: $product" # 输出 30
echo "Quotient: $quotient" # 输出 3.33