Linux 计算语法错误

Linux 计算语法错误,linux,bash,calc,Linux,Bash,Calc,我正在寻找一个简单的命令行计算器,发现calc简单而有用,结果它安装在我们的服务器上 这是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 有人知道错误是怎么来的吗?谢谢 只

我正在寻找一个简单的命令行计算器,发现calc简单而有用,结果它安装在我们的服务器上

这是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

有人知道错误是怎么来的吗?谢谢

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

例:


使用更多的引用!它们至关重要。此外,还要学习“和”之间的区别。请参见和

好的。事情是这样的

这与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的目录中创建文件时,输出已更改

这里的情况是,*模式是一个通配符。它与包含的模式的任何计数都匹配。Bash还有一个奇怪的副作用,如果模式不匹配,它会返回最初看到的模式,而不是什么都不返回

因此,在您的例子中,您无意中使用了bash的一种通配符替换方法

那么,为什么失败呢?这是因为括号是bash中的另一个命令,而这一个恰好被用作语法错误

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

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


是的,这是可行的,但是为什么引号的使用在除法中重要而在乘法中不重要呢?哦,但这解释了除法而不是乘法。。Calc3*1+2在没有引号的情况下运行良好……好吧,我的错,所以特瓦尔伯格也是对的。但最后,答案是肯定的,你应该总是用单引号保护算术表达式,哇,这么多信息隐藏在一个简单的符号后面。。谢谢你的解释!
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)
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 `('