【问题标题】:calc syntax error计算语法错误
【发布时间】:2013-03-16 20:43:57
【问题描述】:

我一直在寻找一个简单的命令行计算器,发现 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

有人知道错误是如何产生的吗?谢谢!

【问题讨论】:

    标签: linux bash calc


    【解决方案1】:

    好的。这是发生了什么。

    这与 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 的通配符替换方法之一。 Pattern Matching.

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

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


    另外,顺便说一句,我们可以禁用*(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 `('
    

    【讨论】:

    • 哇,一个简单的符号背后有这么多信息......感谢您的解释!
    【解决方案2】:

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

    例如:

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

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

    【讨论】:

    • 是的,这行得通,但为什么引号的使用在除法而不是乘法中很重要?
    • 哦,但这解释了除法而不是乘法.. calc 3*(1+2) 没有引号就可以正常工作...
    • 好吧,我的错,所以 twalberg 也是对的。但最后,答案是可以的,你应该总是用单引号保护算术表达式'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多