我的代码是
[[ <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
答案 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
这会运行内置true
和false
而不是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"