我喜欢有一个方便的命令行计算器。要求是:
- 支持所有基本算术运算符:+、-、/、*、^ 用于求幂,加上括号用于分组。
- 需要最少的输入,我不想调用一个程序与之交互,然后要求它退出。
- 理想情况下,除了表达式本身之外,命令行中只应输入一个字符和一个空格。
- 它应该知道如何忽略逗号和美元(或其他货币符号)
数字让我可以放心地从网络复制/粘贴
关于在将每个数字粘贴到计算器之前必须清理它
- 允许空白,存在或缺少空格都不会导致错误
- 无需在表达式中引用任何内容来保护它免受 shell 的影响 - 再次是为了减少输入次数
由于 tcsh 支持别名位置参数,并且由于别名扩展先于除历史扩展之外的所有其他扩展,因此可以直接在 tcsh 中实现接近我的理想的东西。
我用过这个:
alias C 'echo '\''\!*'\'' |tr -d '\'',\042-\047'\'' |bc -l'
现在我可以用最少的打字来做如下的事情:
# the basic stuff:
tcsh> C 1+2
3
# dollar signs, multiplication, exponentiation:
tcsh> C $8 * 1.07^10
15.73721085831652257992
# parentheses, mixed spacing, zero power:
tcsh> C ( 2+5 ) / 8 * 2^0
.87500000000000000000
# commas in numbers, no problem here either:
tcsh> C 1,250.21 * 1.5
1875.315
正如您所看到的,无需引用任何内容即可使所有这些工作正常进行。
现在问题来了。尝试在 bash 中执行相同的操作,其中不支持参数别名,迫使我将计算器实现为 shell 函数并使用“$@”传递参数
function C () { echo "$@" | tr -d ', \042-\047' | bc -l; }
这会以多种方式中断,例如:
# works:
bash$ C 1+2
3
# works:
bash$ C 1*2
2
# Spaces around '*' lead to file expansion with everything falling apart:
bash$ C 1 * 2
(standard_in) 1: syntax error
(standard_in) 1: illegal character: P
(standard_in) 1: illegal character: S
(standard_in) 1: syntax error
...
# Non-leading parentheses seem to work:
bash$ C 2*(2+1)
6
# but leading-parentheses don't:
bash$ C (2+1)*2
bash: syntax error near unexpected token `2+1'
当然,在表达式周围添加引号可以解决这些问题,但违背了原来的要求。
我明白whybash 中出现问题。我不是在寻找解释。相反,我正在寻找一个solution这不需要手动引用参数。我对 bash 向导的问题是,有没有办法让 bash 支持方便的最小输入计算器别名。不需要像 tcsh 那样引用?这不可能吗?谢谢!