gpt4 book ai didi

linux - 计算语法错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:21 27 4
gpt4 key购买 nike

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

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

最佳答案

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

这与 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 `('

关于linux - 计算语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15647496/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com