我尝试使用这个:
$ 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)
什么是正确的格式?我尝试了几个都没有运气。
[根据 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。关于bash:man 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 次 |
| 最近记录: |