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

要点:

  1. fltexpr 默认不启用,需要先 enable
  2. fltexpr 默认保存到变量,需要 -p 选项输出
  3. "${*/x/\*}" 将所有参数传入,同时替换 x\*, 后者输入麻烦
  4. 必须使用 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

要点:

  1. IFS=+ 自动添加加号
  2. ${ ;}Bash 5.3 新命令格式,能避免进程开销

函数支持 =.

Bash 尚不支持复杂数学函数,一种选项是调用外部程序(calc/numbat/python/node):

function =. {
  numbat -e "${*:-0}"
}
> =. 'sin(2)' + 1
1.9093

或者使用 FFI.

不过两种方案都略显多此一举。