bash 中的 if 和 [[ 有什么区别?

bash 中的 if 和 [[ 有什么区别?

我看到

if cmd
then
echo Hi
fi

工作方式不同于

if [[ $(cmd) ]]
then
echo Hi
fi

那么当有 [[ 和没有 [[ 时会发生什么?

答案1

在 shell 中[是 test 命令的别名。它命令。这[[是某些 shell 的一个功能,只是略有不同。在 bash 中它是一个关键字,而不是一个命令,但功能类似于命令。

您可以这样想:您正在运行[[并提供“$(cmd)”的输出作为该命令的参数。if然后检查 的返回状态[[。当没有给 提供任何运算符时[[-n则暗示 , 。

   -n string
          True if the length of string is non-zero.

举个例子:

if cmd          # check the return status of cmd
if [[ $(cmd) ]] # check if cmd has any output

答案2

语句(不带括号)在被评估为 bash 命令后if expr检查返回状态。expr成功后,它被视为一种true价值。

另一方面,if [[ expr ]]带有双方括号的是bash特定的关键词它可以处理自己的一组选项,例如-f /path/to/file测试文件是否存在,甚至处理变量测试,例如$a == $b.在这些括号内,您必须明确告诉它将某些表达式计算为一组 bash 命令if [[ $(cmds) ]]。否则,它将把那里的任何内容视为特殊表达式,并以不同的方式进行解析。

还有一个if [ expr ]构造,它通常是一个别名(或者,在某些情况下,是一个近似的实现)if test expr。如果该test命令有可用的选项,那么您也可以在单括号之间使用它。

为了更有趣,有一个if ((expr))构造,它在处理数字时最好,因为里面的所有内容都被评估为算术表达式。这也是一个关键字,就像双括号一样。

基本上,if exprif [ expr ]是可移植的(即所有 shell 都可以处理它们,并且处理它们几乎相同)并且if [[ expr ]]if (( expr ))是特定于实现的,即它们是关键字,其评估很大程度上取决于您在其中使用它们的 shell(如果您是不使用诸如bashzsh、 或 之类的东西ksh,它们甚至可能不存在)。

相关内容