Bash`if $ variable;然后`返回`0:命令未找到`

时间:2016-02-27 01:31:55

标签: bash

我的代码是

[[ <some test I will need to verify several times> ]]
IS_WHAT_I_WANT=$?

if $IS_WHAT_I_WANT; then
  echo "Good"
fi

我已经看过几个测试变量存储测试结果的例子,所以我确信这样可行。但是,当我运行这个东西时,我会收到:

-bash: 0: command not found

它似乎试图在IS_WHAT_I_WANT var内部运行,而不是简单地测试它。这是为什么?为什么if $var;的其他示例有用,而且这个例子没有?

运行GNU bash 3.2.57

3 个答案:

答案 0 :(得分:2)

if的语法采用命令;运行该命令,并检查其退出状态。

如果您尝试将0作为命令运行,假设您没有/usr/bin/0或类似命令,则会失败 - 从而导致非零退出状态。

请考虑使用数学上下文:

if (( IS_WHAT_I_WANT == 0 )); then
  : "do something here"
fi

更好的是根本不存储退出状态。

foo; foo_result=$?
if [ "$foo_result" = 0 ]; then
  : "something"
fi

...通常可以更清晰地写成:

if foo; then
  : "something"
fi

答案 1 :(得分:0)

if命令有非常具体的要求。你需要方括号和测试用例。在bash中,运行help test以了解有关方括号之间可以使用哪种表达式的详细信息。在这种情况下,您只想知道它是否为零(表示干净的退出)。

你走了:

[[ <some test I will need to verify several times> ]]
IS_WHAT_I_WANT=$?

if [ $IS_WHAT_I_WANT = 0 ]; then
  echo "Good"
fi

根据您的评论,不喜欢到目前为止发布的三个几乎相同的答案,您已经注意到您不需要额外的评估。你可以这样做:

if [[ <some test I will need to verify several times> ]]; then
  IS_WHAT_I_WANT=true
else
  IS_WHAT_I_WANT=false
fi

if $IS_WHAT_I_WANT; then
  echo "Good"
fi

这会运行内置truefalse而不是shell表达式。它做了同样的事情。

当然,如果您以后不需要该返回值,您可以直接放置条件:

if [[ <some test I will need to verify several times> ]]; then
  echo "Good"
fi

答案 2 :(得分:0)

存储在IS_WHAT_I_WANT中的返回码不是布尔值。尝试像

这样的东西
if [[ $IS_WHAT_I_WANT == 0 ]]; then
   echo "Good"; 
fi

或更短

[[ $IS_WHAT_I_WANT == 0 ]] && echo "Good"