bash:意外标记“}”附近的语法错误

Mic*_*ant 4 shell test

我尝试使用这个:

$ if [$a == 1] then { echo 'yes'; } fi;
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

-bash: syntax error near unexpected token `}'
Run Code Online (Sandbox Code Playgroud)

什么是正确的格式?我尝试了几个都没有运气。

ric*_*ici 6

[根据 bash 的说法,这只是另一个角色;它不是自定界的。所以你需要在[和周围放置空格]。虽然你最好使用[[and ]]

并且后面的命令if(是的,[是一个命令)必须以 a;或换行符终止。

最后,==(不是 posix,FWIW;posix 更喜欢=)是字符串相等,而不是数字相等。

所以你的意思可能是:

if [[ $a -eq 1 ]]; then echo yes; fi
Run Code Online (Sandbox Code Playgroud)

但是您可以改用算术评估:

if ((a == 1)); then echo yes; fi
Run Code Online (Sandbox Code Playgroud)

(在算术计算中,相等是==,并且$在变量名之前不需要。我知道这很令人困惑。)

有关更多信息[help test。关于[[:帮助[[(基于test)。关于((help let。关于bashman bash


小智 5

概括

使用:

if [ "$a" = 1 ]; then echo yes; fi
Run Code Online (Sandbox Code Playgroud)

完整答案

bash 报告的错误:-bash:意外标记“}”附近的语法错误是试图引导代码编写者发现错误,但 bash 很容易出错,并在错误的地方发出错误信号。

实际上,代码中有几个错误。但让我们用更简单的代码行重现 bash 报告的错误:

$ if true then { true; } fi;
bash: syntax error near unexpected token `}'
Run Code Online (Sandbox Code Playgroud)

如果该行稍有变化,则会在大约相同的位置报告错误,但略有不同:

$ if true then true; fi;
bash: syntax error near unexpected token `fi'
Run Code Online (Sandbox Code Playgroud)

并且,这还报错:

$ if true; then; true; fi;
bash: syntax error near unexpected token `;'
Run Code Online (Sandbox Code Playgroud)

所有这一切的发生是因为所需的语法(从手册中复制)是:

if list; then list; fi;
Run Code Online (Sandbox Code Playgroud)

其中是一个或多个以换行符分号list结尾的简单命令(或管道或复合命令)。请注意,一般来说,换行符可以替换为分号,反之亦然。

这是有效的(没有报告语法错误)

if   true;   then   true;   fi
Run Code Online (Sandbox Code Playgroud)

这也是有效的:

if     true
then   true
fi
Run Code Online (Sandbox Code Playgroud)

或者:

if echo start; true; then echo decision; true; echo next; fi;
Run Code Online (Sandbox Code Playgroud)

或者换行符和/或分号的其他变体。

当然,最后一个分号不是必需的,但也不是禁止的。

此外,[]要求(通常)空格被 bash 区分为单词(标记),因此被理解为测试

if [ $a == 1 ]; then { echo 'yes'; } fi;       # still subtly incorrect.
Run Code Online (Sandbox Code Playgroud)

但是,变量扩展也应该用引号括起来("$a"),==在 bash 中有效,但在其他一些 shell 中可能无效,所以我们应该使用=内部 single [ ]'yes'技术上不需要引用(即使它没有害处),并且{ }单个简单命令不需要大括号,所有这些都使它成为一个更好的版本:

if [ "$a" = 1 ]; then echo yes; fi
Run Code Online (Sandbox Code Playgroud)

或者,如果您选择使用 bash/ksh/zsh [[ ]]

if [[ $a == 1 ]]; then echo yes; fi
Run Code Online (Sandbox Code Playgroud)

=最后,使用or 进行的测试==是字符串比较,而不是数字比较,因此即使它们具有值,也不会+1等于1要进行数值测试,您可以使用-eq.


归档时间:

查看次数:

23312 次

最近记录:

6 年,3 月 前