为了保持一致,我尝试在所有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
和非零)回显something
或other
)。
如果只是检查命令的返回值,请删除双括号。
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
以获取有关牙套的详细信息。