以下是我的腳本的一部分。 「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