linux 交互式命令
如果您正在阅读本文,那么您不仅会熟悉计算机系统上的命令行,而且很乐意使用它来排除图形界面,这很有可能。 据我了解,我一直在使用命令行,因为那是计算世界中的唯一选择,甚至可以追溯到BSD Unix。 现代GUI有很多使它们更加出色的方法,但是就功能,速度和灵活性而言,命令行仍然摇摇欲坠,如果您可以快速键入,则更是如此。
在典型的Unix或Linux系统中,命令行中缺少某些功能,但特别是功能强大且灵活的计算器。 您可以使用expr
甚至shell $(( ))
表示法,但是它们非常有限,当您尝试求解10/3或其他非简单整数数学的运算时,这将立即显而易见。
您可以使用基本的计算器bc ,但这是一种只有灰心的老式黑客才可能喜欢的语言的工具,并且这些年来一直很难理解它在系统中的用途。 bc界面笨拙,缺少有用的命令行选项,因此bc仍然是操作系统的一部分是一个谜。
幸运的是,我们谈论的是Linux,这意味着我们可以通过在提供所需所需原始功能的工具周围包装更好的接口来解决问题,这在Linux术语中,显然是“包装程序”。
这就是Bash shell脚本calc的功能-提供一个简单,用户友好的命令行计算器。 它甚至具有有用的默认值,因此您不必记住在求解10/3之前将小数精度设置为非零。
与卑诗省合作
bc被誉为任意精度的二进制计算器 ,但是奇怪的是,它的默认行为是在没有任何提示的交互式外壳中仅使用整数值。 这是一个典型的交互:
$ bc
1
+
1
2
10
/
3
3
quit
输入一个数学方程式并将其求解,并显示结果。 但是10/3还是3? 为了解决这个问题, bc用户很快就熟悉了scale
,它可以让您指定显示结果的精度。 较高的小数位数在小数点后提供更多位数。 如:
10
/
3
3
scale
=
4
10
/
3
3.3333
scale
=
20
10
/
3
3.33333333333333333333
quit
这真是足够的信息,您可以了解如何生成简单的命令行友好的浮点计算器作为shell脚本:
这个想法很简单:无论用户指定作为命令的一个或多个参数,将其直接输入bc ,但是通过将scale设置为2作为其开头。在实践中,它已经非常有用:
$ calc
'(100/3) * 2 + (11 + 333.5)'
411.16
还不错 但是,让我们采用这个简单的想法,并将其变成一个交互式计算器外壳,您可以在其中打开一个窗口,并且每当遇到方程式时,只需将其复制/粘贴并快速求解即可。
Calc:交互式计算器
上面的小shell脚本可以变成一个简单的函数而不必大惊小怪,最终看起来像这样:
scriptbc
(
)
{
scale =
$1 ;
shift
cat
<< EOF
|
$bc
scale =
$scale
$*
EOF
}
在shell脚本中调用此函数时,您需要记住的就是,第一个参数始终是所需的比例,否则bc肯定会感到困惑。
但这是艰苦的工作。 现在,主循环出奇的简洁:
while
read
command args
do
case
$command
in
quit
|
exit
)
exit
0
;;
help
| \?
) show_help
;;
scale
)
scale =
$args
;;
*
) scriptbc
$scale
" $command "
" $args "
;;
esac
/ bin
/
echo
-n
"calc> "
done
不太复杂,并且还添加了附加的帮助功能。 请注意,聪明的方法是,Bash shell中,您可以与工作read
while语句中的命令too- read
总是击穿什么用户在键入每列变一个字,并在最后给出的变量的一切。 因此,如果用户键入1 + 1表示read command args
表示command =“ 1+1
”,但是如果用户键入“ 1 +1”,则命令=“ 1
”和args =“ + 1
”。 在这两种情况下,它都可以正常工作,但是,当然,这样用户也可以指定命令字。
一些额外的echo语句使事情变得很漂亮,我们有一个真正的交互式计算器,具有很多功能,全部由bc提供支持:
$ calc
Calc--a simple calculator. Enter
'help'
for
help ,
'quit' to quit.
calc
>
help
In addition to standard math functions, calc also supports:
a
% b = remainder of a
/ b
a^b = exponential: a raised to the b power
s
( x
) = sine of x, x
in radians
c
( x
) = cosine of x, x
in radians
a
( x
) = arctangent of x,
in radians
l
( x
) = natural log of x
e
( x
) = exponential log of raising e to the x
j
( n,x
) = Bessel
function of integer order n of x
scale N = show N fractional digits
( default =
2
)
calc
> s
(
1
)
.84
calc
>
100 +
(
10
*
3.55
)
135.50
calc
>
5545 +
11 –
4.55
5551.45
calc
>
10
/
3
3.33
calc
> quit
尽管它的界面可能很奇怪,但事实证明, bc在其广为人知的地方还有其他技巧,包括用户设置和使用变量的能力,使其更像是一种数学编程语言。 问题是,此脚本每行调用一次bc的方式,无法在两次调用之间保留状态。 这意味着尽管用户可以输入诸如cars=25
语句,但是如果他们随后在下一行中引用该变量,则该变量将从bc的内存中消失。
卑诗省拥有隐藏的超级大国,但…
bc还支持各种编程结构,包括if
, while
和for
语句,暂停,中断,continue for循环管理和功能。 但坦率地说:如果您真的想编写一个解决数学方程式的简洁程序,则有更好的选择,从Perl到大型超级强大的工具(如Matlab) 。
尽管我非常喜欢渐进式特征主义背后的创新精神,但要认识到给定程序的局限性和功能,还有很多话要说,而不是花很多时间使它变得更复杂,而只是接受它可以解决一些问题,但不是全部-这个领域中的问题。 确实,尽管bc支持函数,命令流和变量,但我怀疑您很难在使用该功能的现代Unix或Linux系统上找到单个脚本,并且可能在没有人注意的情况下将其从bc中删除。
快速,简单的解决方案一直是命令行界面的强大功能,也是使Unix系统设计如此强大的原因,这一直是命令行界面的强大功能。 我和我的合著者在《 Wicked Cool Shell Scripts 2nd Edition 》一书中非常详细地探讨了这个概念,提供了100多个Bash shell脚本以使您惊叹不已。 但是,更根本地讲,无论您是在Mac OS命令行,Linux系统还是老式Unix服务器上,我们都使用脚本在命令行的砖墙上添加一层新的砂浆。
如果您偶而使用命令行,您会惊讶于我们的脚本集合(例如calc)将为您提供的帮助。 毕竟,用小的砖块和小的砂浆抹子就能造就伟大的建筑,对吗?
翻译自: https://opensource.com/article/16/12/calcshell-interactive-linux-command-line-calculator
linux 交互式命令