好吧我对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
答案 0 :(得分: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
语句。
答案 1 :(得分:1)
执行命令后,返回的值存储在shell变量$?中。所以你必须将它与成功和失败的返回值相匹配
if [ $? == 1 ]
then
#do something
else
#do something else
fi
答案 2 :(得分:0)
关于$的其他答案?很好(虽然注意假设0以外的值而不是0 - 不同的命令。或者同一命令的不同版本可能会因不同的值而失败),但是如果你只需要立即采取行动或失败,你可以简化事情:
if command ; then
# success code here
else
# failure code here
fi
或者如果你只是想在失败时采取行动,这里有一个老shell的黑客攻击(冒号是一个空命令,但它满足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; }