2015-12-05 51 views
1

我正在使用bash腳本將數據庫轉儲到要通過FTP上傳的文件。它將通過cron作業啓動,並且sql server不是本地主機。mysql在BASH腳本中應返回1時返回0

我有腳本工作,但我遇到了錯誤檢查的路障。如果腳本無法連接到sql服務器(萬一它發生故障),我希望它停止並將任何問題輸出到錯誤日誌中。輸出到錯誤日誌工作正常,但腳本仍然運行並創建一個空白文件。我正在嘗試使用$?檢查mysql連接是否失敗,甚至當我使用的是關閉的測試服務器時,返回的是0而不是1.我在牆上打了一個洞,我抨擊我的頭,我在做什麼錯誤?

如果之前已經詢問過這個問題,請指出正確的方向,但是當我搜索時我找不到任何答案。在bash腳本的

內容:

{ 
mysql -h $HOST -u $USERNAME -p$PASSWORD < dump.sql | sed "s/\t/\",\"/g;s/^/\"/;s/$/\"/" > test.csv 
} 2>error.log 
if [ $? -ne 0 ]; then { echo "SQL Server connection failed. Aborting" ; exit 1; } fi 
+2

'$?'捕獲sed的返回值我猜,不是mysql,看這裏:http://stackoverflow.com/questions/1221833/bash-pipe-output-and-capture-exit-status –

+0

或你可以做'mysql ... < dump.sql > test.csv 2> err; mySqlStat = $? ; sed'....'test.csv'祝好運。 – shellter

回答

1

$?在這種情況下,返回你的sed命令,而不是mysql命令的結果。由於sed命令總是成功(您正在向其傳遞有效的輸入以及一組有效的替換),因此您總是在$?中獲得0。

在bash腳本中使用一個或多個管道命令時,您需要使用內置的PIPESTATUS變量,這將允許您檢查一系列管道命令中每個命令的返回值,而不管管道有多少一起。

+0

這解決了它。只是想指出(對於其他像我這樣的「特殊」人)如果您使用的是「sh