0

我一直在寻找一个简单的命令行计算器,发现 calc 既简单又有用,事实证明它安装在我们的服务器上。

这是 calc 的网站:http ://www.isthe.com/chongo/tech/comp/calc/

但是,当我尝试简单的计算时,例如:

calc 3/(1+2)

它给了我这个错误信息:

-bash: syntax error near unexpected token `('

但是,这很好用:

calc 3*(1+2)

3*(1+2) = 9.000000

服务器版本为:

$ uname -sr
Linux 3.2.0-23-generic

有谁知道错误是如何出现的?谢谢!

4

2 回答 2

4

好的。这是正在发生的事情。

这与 calc 无关,与 bash 有关。为了解释这一点,我先举一个 echo 的例子。

wlynch@host:/tmp/blah$ ls          # No files in this directory
wlynch@host:/tmp/blah$ echo *(3)   # This works as you expect.
*(3)                               #
wlynch@host:/tmp/blah$ echo *(4)   # This works as you expect.
*(4)                               #
wlynch@host:/tmp/blah$ touch 3     # Create a file named 3 in the directory.
wlynch@host:/tmp/blah$ ls          #
3                                  #
wlynch@host:/tmp/blah$ echo *(3)   # This now gives a different result!
3                                  #
wlynch@host:/tmp/blah$ echo '*(3)' # Quoting gives what you want.
*(3)                               #
wlynch@host:/tmp/blah$ echo *(4)   # This works as you previously expected.
*(4)

请注意,当我们在名为3.

这里发生的*(pattern)是通配符。它匹配所包含模式的任何计数。Bash 还有一个奇怪的副作用,如果模式不匹配,它不会返回任何内容,而是返回最初看到的模式。

因此,在您的情况下,您不小心使用了 bash 的通配符替换方法之一。模式匹配

现在,至于为什么会/()失败?那是因为括号是 bash 中的另一个命令,而这个命令恰好被用作语法错误。分组命令

正如其他答案中提到的那样,该解决方案用引号将您的命令行参数括起来,这样这些功能都不会启用。


另外,顺便说一句,我们可以禁用*(pattern)使用的功能。如果我们这样做,那么/()*()都会因为括号而失败()

wlynch@host:/tmp/blah$ shopt -s extglob
wlynch@host:/tmp/blah$ echo *()
*()
wlynch@host:/tmp/blah$ echo /()
bash: syntax error near unexpected token `('

wlynch@host:/tmp/blah$ shopt -u extglob
wlynch@host:/tmp/blah$ echo *()
bash: syntax error near unexpected token `('
wlynch@host:/tmp/blah$ echo /()
bash: syntax error near unexpected token `('
于 2013-03-26T21:57:08.027 回答
4

您只需要在算术表达式中添加引号:

前任 :

$ calc '3/(1+2)'
    1

“使用更多报价!” 它们至关重要。此外,了解 ' 和 " 和 ` 之间的区别。参见http://mywiki.wooledge.org/Quoteshttp://wiki.bash-hackers.org/syntax/words

于 2013-03-26T21:15:34.743 回答