2010-09-21 251 views
1

我想確認我是否可以連接到數據庫(PostgreSQL的)成一個bash腳本

我執行以下命令(PGUSER,PGDATABASE ......被設置)

psql -f sql/test_connection.sql > /dev/null 2>&1 

當我回聲$?如果成功則顯示0,否則顯示2。

它在終端中正常工作。

當我把它放到bash腳本中時,即使憑據不正確,結果也總是爲0。

psql -f sql/test_connection.sql > /dev/null 2>&1 

if [ $? ] 
then 
    echo "OK" 
else 
    echo "Doudh!!" 
fi 

我在哪裏錯過了什麼?

回答

3

需要注意的是,如果你只是傳遞$?test(爲[另一個名字),這將擴展成字符串02取決於命令是否成功。當test傳遞一個字符串時,它只是測試字符串是否爲空。在這種情況下,它總是會返回0(true),因爲這兩個字符串都是非空的。

你可能想要做的就是使用的psql的返回值作爲參數傳遞給if直接,而無需使用$?指它是什麼:

if psql -f sql/test_connection.sql > /dev/null 2>&1 
then 
    echo "OK" 
else 
    echo "Doudh!!" 
fi 

或者,你可以測試$?0直接

if [ $? -eq 0 ] 
then 
    echo "OK" 
else 
    echo "Doudh!!" 
fi 
+1

+1:我覺得這解釋得最好。 – 2010-09-21 20:06:11

5

試試這個:

if [ $? -eq 0 ] 

運行腳本時使用-x選項每個命令正在與實際值執行其打印出來。它對調試非常有用。你會看到什麼與什麼比較,什麼傳遞給哪個命令。

$sh -x prg.sh 

$bash -x prg.sh 
+0

謝謝。我必須在bash中思考,而不是在C,java,perl中......帶有'if true'的樣式 – 2010-09-21 20:05:15

1

[ $? ]相當於[ -n $? ]將檢查$?膨脹是否爲非零長度的串,這將總是爲真,因爲$?擴展到一個退出狀態,其永遠不會成爲空字符串。爲了檢查一個值是否爲零或不使用[$? -eq 0](($?))

這是除了更好地使用:

if psql -f sql/test_connection.sql > /dev/null 2>&1 
then 
    echo "OK" 
else 
    echo "Doudh!!" 
fi 

這將運行命令,如果命令的退出狀態是零,或者else部分是非零的執行,然後一部分。