我有一个bash脚本,调用另一个包含psql命令的脚本,我想在psql命令失败时停止执行。以下psql调用执行postgres函数。在下面的脚本中,echo $exitcode总是返回0,即使脚本调用postgres函数返回错误。我希望psql命令返回正确的错误代码,所以我可以在下面的脚本中正确处理它。FirstScript:
list=`sh /opt/dbb_promo_list.sh -60 -30`
ID_LIST=`echo $list |sed 's/[a-z _-]*//g'|sed 's/(.*//g'`
exitcode=$?
echo $exitcode //always returns 0 both in successful and error case, i want it to return corresponding exit code for error, so i can handle it and stop the script.
if [ $exitcode -ne 0 ] ; then
echo "There seems to have errors while running script "
echo "Exit code is : "$exitcode
exit 1
fi
dbb_promo_list.sh:该脚本包含以下命令
psql -U $DB_USERNAME -h $DB_HOST -p $DB_PORT -d $DATABASE -c "SELECT schema.${PROCEDURE}($day_begin,$day_end)"
调用上述命令时在下面抛出错误。由于抛出这个错误,psql命令不应该返回退出代码0,但事实并非如此,即使postgres函数工作正常或返回如下错误,它也会返回0。我不确定是否有一种方法来调整bash脚本以识别抛出的错误
ERROR: function string_agg(numeric, unknown) does not exist
LINE 1: SELECT string_agg(pmotn_id, ',') FROM ppcapr.p...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
sql函数失败时。然后,它在控制台上报告错误,但继续执行脚本的其余部分。但我希望脚本执行终止一旦错误发生。
有什么建议吗?
$?
变量保存最后执行的命令退出代码。
在您的代码中,exitcode=$?
行之前执行的最后一个命令是sed 's/(.*//g'
,而不是psql命令。只要把这一行往上移就可以解决问题。
注:我知道这是一个老问题,但有人可能会从答案中受益。