$((...))和expr对比表
| 特性 | $((a+b+c)) |
expr $a+$b+$c |
|---|---|---|
| 性能 | ⚡ 极快(内置) | 🐌 慢(外部命令) |
| 语法 | 简洁直观 | 繁琐,需要转义 |
| 功能 | 丰富(位运算、自增等) | 有限 |
| 安全 | 好(变量安全) | 差(变量展开问题) |
| 错误处理 | 明确 | 可能静默失败 |
| 兼容性 | Bash/Ksh/Zsh | 几乎所有shell |
最佳实践: 除非需要在 POSIX sh 中保持最大兼容性,否则总是使用 $(( )) 进行算术运算。
注:
bash
# 默认 scale=0,只输出整数
echo "5/2" | bc # 输出: 2(没有小数)
# 设置 scale=2,保留2位小数
echo "scale=2; 5/2" | bc # 输出: 2.50
$((...))和bc对比表
| 运算类型 | Bash 方法 | 示例 | 注意 |
|---|---|---|---|
| 整数运算 | $(( )) |
echo $((5/2)) |
输出 2 |
| 小数运算 | bc |
`echo "5/2" | bc` |
| 复杂数学 | bc -l |
`echo "s(1)" | bc -l` |
| 高性能 | awk |
awk 'BEGIN{print 5/2}' |
适合批量处理 |
| 格式化 | printf |
printf "%.2f" 2.5 |
只格式化,不计算 |
建议:
- 如果只需要整数运算,使用
$(( ))(最快) - 如果需要小数运算,使用
bc或awk - 如果大量小数运算,考虑使用
awk或切换到 Python/Perl 等脚本语言 - 考虑使用 Zsh 如果你经常需要浮点运算