在 bash 中执行双括号中的命令不起作用



为了保持一致,我尝试在所有if语句中使用双括号[[ ]]。但是,当我要检查要运行的命令的返回值时,我确实遇到了问题。在测试了几种创建 if 语句的方法后,我发现只有没有括号才能执行命令。

以下方法不起作用:

if [[ $command ]] ; then
    echo "something"
fi
if [[ $(command) ]] ; then
    echo "something"
fi
if [[ ${command} ]] ; then
    echo "something"
fi

上面的代码使 if 循环为真,即使命令未运行也是如此。由于上面的代码不适用于大括号,因此使用它也不起作用:

[[ $command ]] || echo "failed"

而且它在子壳中也不起作用。

以下作品:

if $command ; then
    echo "something"
fi
if $(command) ; then
    echo "something"
fi

为什么将命令放在带括号的 if 循环中不起作用,为什么上面的 if 循环在甚至没有运行命令时报告 true?我使用的是 bash 版本 4.1.9。我尝试了很多次,if 循环就像我上面键入的一样简单,它只是检查命令是否成功运行,如果没有,则退出。

简短的回答是:

  • [[[期待一个表达

  • if需要一个命令

谚语:

[[ $(command) ]]

基本上会执行:

[[ -n <command_output> ]]

这可能是也可能不是您想要的。 另一方面,说:

$command && echo something || echo other

将根据命令的返回代码(分别为0和非零)回显somethingother)。

如果只是检查命令的返回值,请删除双括号。

if $command
then
    echo "Command succeeded"
else
    echo "Command failed: $!"
fi

双括号是测试命令。(嗯,不是真的,但它们是作为test命令别名的单个方括号的起飞。在早期的 Bourne shell 中,你会看到这样的东西:

if test -z "$string"
then
    echo "This is an empty string"
fi

方括号是句法糖:

if [ -z "$string" ]
then
    echo "This is an empty string"
fi

因此,如果您没有进行实际测试,则可以消除双方括号或单方括号。

如果你使用方括号,

你应该使用双括号而不是单括号,因为双括号更宽容一些,可以做更多的事情:

if [ -z $string ]    #  No quotes: This will actually fail if string is zero bytes!
if [[ -z $string ]]  #  This will work despite the lack of quotes

双括号是test的快捷方式。在您的示例中,正在测试外壳变量$command是否存在。

if [[ $PWD ]]; then
    echo PWD is set to a value
fi
if [[ $NOT_A_REAL_VAR ]]; then
    echo Nope, its not set
fi

在第二个示例中,你使用命令替换来检查command标准输出上输出的内容。

if [[ $(echo hi) ]]; then
    echo "echo said hi'
fi
if [[ $(true) ]]; then #true is a program that just quits with successful exit status
    echo "This shouldn't execute"
fi

你的第三个例子和你的第一个例子差不多。如果要对变量进行分组,请使用大括号。例如,如果您想在某物后面加上"s"。

WORD=Bike
echo "$WORDS" #won't work because "WORDS" isn't a variable
echo "${WORD}S" # will output "BikeS"

然后在第五个示例中,您正在运行位于 command 中的程序。

因此,如果要测试某些字符串,请使用 [[ ]] 或 [ ]。如果你只是想测试一个程序的退出状态,那么不要使用它们,只使用一个裸露的if。

查看man test以获取有关牙套的详细信息。

相关内容

  • 没有找到相关文章

最新更新