以下是我的脚本的一部分。 “set -e”将使脚本在任何命令出现负面返回码时退出。在选择查询不返回行时退出Unix脚本
但是,当下面的select语句没有从表中返回任何行时,脚本自身退出(echo“Get Eg names ends”未执行)。这意味着下面的命令给出了负面的返回码。
db2 -x "SELECT EG_NAME FROM MS.CFG_CACHE_REFRESH WHERE
EG_RELOAD_UPD_BK2_TS < M_TABLE_UPD_TS AND CURRENT_TIME >= EG_RELOAD_START_TIME AND
CURRENT_TIME <= EG_RELOAD_END_TIME"
> /home/DummyUser/gm4/logs/MP_CACHE_REFRESH_TEMP_BK2.txt
如果select语句返回一些行,它可以正常工作。该脚本不会退出并运行至结束。
我的要求是在出现真正的错误时退出,如无法连接数据库,语法无效等。 如果表中未返回任何行,则不应将其视为错误。
为什么我得到一个-ve返回代码的select查询不返回行,我该如何处理?
下面是脚本的一部分:
#!/bin/ksh
set -e
brokername=$1
if [ "$#" -ne "1" ]
then
echo "Invalid arugments supplied"
echo "call the script using command:"
echo "MP_CACHE_REFRESH_BRK2.ksh <BrokerName>"
exit -1
fi
touch /home/DummyUser/gm4/logs/MP_CACHE_REFRESH_TEMP_BK2.txt
chmod 777 /home/DummyUser/gm4/logs/MP_CACHE_REFRESH_TEMP_BK2.txt
db2 CONNECT TO MSAPP USER DummyUser using paasss
db2 -x "SELECT EG_NAME FROM MS.CFG_CACHE_REFRESH WHERE EG_RELOAD_UPD_BK2_TS < M_TABLE_UPD_TS AND CURRENT_TIME >= EG_RELOAD_START_TIME AND CURRENT_TIME <= EG_RELOAD_END_TIME" > /home/DummyUser/gm4/logs/MP_CACHE_REFRESH_TEMP_BK2.txt
echo "Get Eg names end"
我认为最好不要使用'set -e',而是直接检查你感兴趣的命令的退出代码($?) – 2014-09-04 16:44:29
@IngoLeonhardt谢谢你的回应。实际上面是完整脚本的非常小的部分,并且在我们认为可能发生错误的每个命令之后检查返回代码实际上会耗费更多时间。我正在寻找一种方法来设置-e。 – nitgeek 2014-09-04 17:03:08
我真的无法想象与数据库访问相比,(通常内置的)测试命令可能会有任何重要的性能问题。此外,明确地检查退出代码会让您自由地输出错误消息等。 – 2014-09-04 17:15:35