我看到
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 expr
和if [ expr ]
是可移植的(即所有 shell 都可以处理它们,并且处理它们几乎相同)并且if [[ expr ]]
和if (( expr ))
是特定于实现的,即它们是关键字,其评估很大程度上取决于您在其中使用它们的 shell(如果您是不使用诸如bash
、zsh
、 或 之类的东西ksh
,它们甚至可能不存在)。