Bash 5.3 fltexpr 实现极简计算器
在终端中偶尔要做简单计算,却要启用 Python/Node.js 这种重量级解释器,颇感浪费。
虽 Bash 本身支持算术,但是原生语法 $(()) 繁琐且只有整数。我更想要的是 Excel
或者 Alfred 那样的输入体验。
所幸 Bash 5.3 新增 fltexpr 命令,浮点数备矣;繁琐问题交给自定义命令:
实现 = 命令
# ~/.bashrc
enable fltexpr # 启用浮点数
function = {
fltexpr -p "${*/x/\*}"
}
现在可以在终端直接输入:
> = 2 + 3
5
> = 2 + 3 x 5
17
要点:
fltexpr默认不启用,需要先enablefltexpr默认保存到变量,需要-p选项输出"${*/x/\*}"将所有参数传入,同时替换x为\*, 后者输入麻烦- 必须使用
function形式,=(){}会解析错误
实现求和求平均 +,+/
另一种常见需求是一串数字求和求平均,此时连多输 + 都嫌麻烦:
function + {
fltexpr -p "${ IFS=+;echo "${*:-0}";IFS=;}"
}
function +/ {
fltexpr -p "(${ IFS=+;echo "${*:-0}";IFS=;})/$#"
}
使用:
> + 1.5 2.2 33.2
36.900000000000006
> +/ 1.5 2.2 33.2
12.300000000000002
要点:
IFS=+自动添加加号${ ;}是 Bash 5.3 新命令格式,能避免进程开销
函数支持 =.
Bash 尚不支持复杂数学函数,一种选项是调用外部程序(calc/numbat/python/node):
function =. {
numbat -e "${*:-0}"
}
> =. 'sin(2)' + 1
1.9093
或者使用 FFI.
不过两种方案都略显多此一举。