Linux 计算语法错误
我正在寻找一个简单的命令行计算器,发现calc简单而有用,结果它安装在我们的服务器上 这是calc的网站: 然而,当我尝试简单的计算时,比如: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 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 `('