【问题标题】:When are square brackets required in a Bash if statement?Bash if 语句中何时需要方括号?
【发布时间】:2021-04-01 00:14:59
【问题描述】:

通常,我在 if 语句中使用方括号:

if [ "$name" = 'Bob' ]; then ...

但是,当我检查 grep 是否成功时,我不使用方括号:

if grep -q "$text" $file ; then ...

if 语句中何时需要方括号?

【问题讨论】:

  • 单个方括号在多个 shell 中兼容,但是其中一些,包括 Bash,支持首选的方括号。请参阅BashFAQ/031 了解更多信息。另见help '['

标签: bash if-statement square-bracket


【解决方案1】:

方括号是test 命令的同义词。 if 语句检查命令的退出状态以决定采用哪个分支。 grep -q "$text" 是一个命令,但 "$name" = 'Bob' 不是——它只是一个表达式。 test 是一个命令,它接受一个表达式并计算它:

if test "$name" = 'Bob'; then ...

由于方括号是test 命令的同义词,因此您可以将其重写为原始语句:

if [ "$name" = 'Bob' ]; then ...

【讨论】:

  • @chepner:为什么if $boolean_var ; then ... 不需要括号?
  • @misha,如果您的$boolean_var 的值为“true”或“false”,它会起作用,因为您正在运行命令 truefalse .
  • 如果 $boolean_var 是 01if $boolean_var ; then ... 不起作用,请参阅 man trueman false
  • @derFunk:如果你在$PATH 中碰巧有01 命令,它会起作用——但这会很难看。
  • spellcheck 不喜欢括号,但适用于 VSCode 中的测试语句。
【解决方案2】:

[ 实际上是一个命令,相当于(几乎,见下文)test 命令。它不是 shell 语法的一部分。 ([test,取决于 shell,通常也是内置命令,但这不会影响它们的行为,除非是为了性能。)

if 语句执行命令,如果命令成功则执行 then 部分,如果命令失败则执行 else 部分(如果有)。 (如果命令以状态 ($?) 为 0 退出则成功,如果以非零状态退出则失败。)

if [ "$name" = 'Bob' ]; then ...

命令是

[ "$name" = 'Bob' ]

(您可以直接执行相同的命令,无需if。)

if grep -q "$text" $file ; then ...

命令是

grep -q "$text" $file

man [man test 了解更多信息。

脚注:[ 命令几乎等同于test 命令。不同之处在于[ 需要] 作为它的最后一个参数,而test 不需要——而且实际上不允许它(更准确地说,test 不会特别对待] 参数;例如,它可能是一个有效的文件名)。 (它必须以这种方式实现,但没有匹配的][ 会让很多人非常非常紧张。)

【讨论】:

  • spellcheck 不喜欢括号,但适用于 VSCode 中的测试语句。
  • @johnrubythecat:你指的是什么“拼写检查”?如果它是为了拼写检查英文文本,那么它当然不会对 shell 语法感到满意。
  • nervous 参数加一。
【解决方案3】:

考虑[ ... ] 语法的最佳方式是将[ 视为一个程序——它就是!

看看这个:

~ $ ls /usr/bin/\[ 
/usr/bin/[

另一方面,您可能没有使用该版本,因为 bash 还提供了 [ 作为内置 shell。

无论如何,回答你的问题:if 所做的是运行你给它的命令并查看它的返回值是否为0。您可以使用[ 进行其他更有趣的比较,例如字符串比较。请参阅man [man bash

【讨论】:

  • bash 手册页中没有任何内容表明 [ 是在内部实现的,我认为这就是 [[ 的用途。
  • @PhilHibbs:我很确定[ 是内置的。这就是builtin [ 起作用的原因。 [[[ 有点不同,它做不同的事情。
  • @PhilHibbs:查看 bash 手册页的 SHELL BUILTIN COMMANDS 部分。 test expr[ expr ] 一起列出。
  • @PhilHibbs:另外,试试type -a [
猜你喜欢
  • 1970-01-01
  • 2014-06-01
  • 2017-01-27
  • 2022-07-16
  • 2015-02-13
  • 2014-11-11
相关资源
最近更新 更多