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

Mis*_*hko 58 bash if-statement square-bracket

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

if [ "$name" = 'Bob' ]; then ...
Run Code Online (Sandbox Code Playgroud)

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

if grep -q "$text" $file ; then ...
Run Code Online (Sandbox Code Playgroud)

声明中何时需要方括号if

che*_*ner 106

方括号是test命令的同义词.一个if语句检查,以决定采取哪一个分支指令的退出状态.grep -q "$text"是一个命令,但"$name" = 'Bob'不是 - 它只是一个表达.test是一个命令,它接受一个表达式并对其进行求值:

if test "$name" = 'Bob'; then ...
Run Code Online (Sandbox Code Playgroud)

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

if [ "$name" = 'Bob' ]; then ...
Run Code Online (Sandbox Code Playgroud)

  • @misha,如果你的`$ boolean_var`的值为"true"或"false",它就可以了,因为你正在运行**命令**`true`或`false`. (7认同)
  • `如果 $boolean_var ; 如果 $boolean_var 为 `0` 或 `1`,则 ...` 不起作用,请参阅 `man true` 和 `man false`。 (4认同)
  • @chepner:为什么`if $boolean_var ;那么 ...` 不需要括号? (2认同)
  • @derFunk:如果你的“$PATH”中碰巧有“0”和“1”命令,它会起作用——但这会很难看。 (2认同)

Kei*_*son 27

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

一个if语句执行的命令和执行then如果命令成功的一部分,或者else一部分(如果有的话),如果它失败.(如果命令以status($?)为0 退出,则命令成功,如果以非零状态退出则失败.)

if [ "$name" = 'Bob' ]; then ...
Run Code Online (Sandbox Code Playgroud)

命令是

[ "$name" = 'Bob' ]
Run Code Online (Sandbox Code Playgroud)

(您可以直接执行相同的命令,不使用if.)

if grep -q "$text" $file ; then ...
Run Code Online (Sandbox Code Playgroud)

命令是

grep -q "$text" $file
Run Code Online (Sandbox Code Playgroud)

man [man test了解更多信息.

脚注:嗯,[命令几乎等同于test命令.不同之处在于它[需要]作为最后一个参数,而test不是 - 事实上它不允许它.(它没有已经被实现这种方式,但一个[不匹配]会作出很多人非常非常紧张.)

  • 为“紧张”的论点加一。 (4认同)

cha*_*ite 9

想到[ ... ]语法的最好方法是考虑[成为一个程序 - 它就是这样!

看一下这个:

~ $ ls /usr/bin/\[ 
/usr/bin/[
Run Code Online (Sandbox Code Playgroud)

另一方面,你可能没有使用它的那个版本,因为它bash也提供[了内置的shell.

无论如何,要回答你的问题:if运行你给它的命令是什么,并看到它的返回值是否0.您可以使用[其他更有趣的比较,例如字符串比较.见man [man bash.