0

好的,我对 bash 脚本编写 [高级的东西] 有点陌生,我需要一点帮助。我什至不知道如何准确表达这一点,所以我只会解释我在做什么以及我需要了解的内容。在我的脚本中,我运行 ./configure 并且我需要能够捕获配置中是否存在错误并在 bash 脚本中做出相应的反应。

代码是:

function dobuild {
echo -e "\e[1;35;40mExecuting Bootstrap and Configure\e[0m"
cd /devel/xbmc
if [ $Debug = "1" ];
then
#either outputs to screen or nulls output
./bootstrap >/dev/null
/usr/bin/auto-apt run ./configure --prefix=/usr --enable-gl --enable-vdpau --enable-crystalhd --enable-rtmp --enable-libbluray  >/dev/null
else
./bootstrap
/usr/bin/auto-apt run ./configure --prefix=/usr --enable-gl --enable-vdpau --enable-crystalhd --enable-rtmp --enable-libbluray
fi
}

并说配置返回错误 1 ​​或 2 我如何捕获并采取行动?

TIA

4

3 回答 3

2

在执行每个 shell 命令后,它的返回值是一个介于 0 和 255 之间的数字,可在 shell 变量中使用?。您可以通过在该变量前面加上运算符来获取该变量的值$

你必须小心一点?,因为它会被每个命令重置,甚至是测试。例如:

some_command
if (( $? != 0 ))
then
   echo "Error detected! $?" >&2
fi

给出:Error detected! 0因为?被测试条件重置。?如果您以后要使用它,最好将它存储在另一个变量中,其中包括对其进行多次测试

要在 bash 中进行数字测试,请使用(( ... ))数字测试结构:

some_command
result=$?
if (( $result == 0 ))
then
   echo "it worked!"
elif (( $result == 1 ))
then
    echo "Error 1 detected!" >&2
elif (( $result == 2 ))
then
    echo "Error 2 detected!" >&2
else
    echo "Some other error was detected: $result" >&2
fi

或者使用case语句。

于 2013-03-13T08:58:51.147 回答
1

命令执行后,返回值存储在 shell 变量 $? 中。所以你必须将它与成功和失败的返回值相匹配

if [ $? == 1 ]
then
    #do something
else
    #do something else
fi
于 2013-03-13T06:57:43.037 回答
0

关于$的其他答案?很棒(尽管要小心假设 0 和非 0 以外的值 - 不同的命令。或者同一命令的不同版本可能会因不同的值而失败),但如果您只需要立即对成功或失败采取行动,您可以简化事物:

if command ; then
    # success code here
else
    # failure code here
fi

或者,如果您只想对失败采取行动,这里有一个针对旧 shell 的 hack(冒号是一个空命令,但它满足 then 子句):

if command ; then : 
else
    # failure code here
fi

但在像 bash 这样的现代 shell 中,这更好:

if ! command ; then   # use the ! (not) operator 
    # failure code here
fi

而且,如果您只需要做一些简单的事情,您可以使用“短路”运算符:

   command1 && command2_if_command1_succeeds
   command1 || command2_if_command1_fails

那些只适用于单个命令,字符串更多 && 和 || 在大多数情况下,它们不会像你想象的那样做,所以大多数人都会避免这种情况。但是,如果将它们分组,则可以执行多个命令:

   command1 && { command2; command3; command4; }

这可能很难阅读,因此如果您全部使用它,最好保持简单:

   command1 || { echo "Error, command1 failed!" >&2; exit 1; }
于 2013-03-13T14:51:42.947 回答