我一直在寻找一个简单的命令行计算器,发现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
有谁知道错误是怎么出现的?谢谢!
答案 0 :(得分:4)
您只需要在算术表达式中添加引号:
前:
$ calc '3/(1+2)'
1
“使用更多报价!”它们至关重要。另外,了解'和'与`之间的区别。请参阅http://mywiki.wooledge.org/Quotes和http://wiki.bash-hackers.org/syntax/words
答案 1 :(得分: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的通配符替换方法之一。 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 `('