我用$?是否正确?

时间:2010-09-21 19:53:01

标签: bash

我想验证我是否可以将数据库(PostgresSQL)连接到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 个答案:

答案 0 :(得分:5)

试试这个:

if [ $? -eq 0 ]

运行脚本时,使用-x选项,该选项使用实际值打印出正在执行的每个命令。它对调试非常有用。您将看到与什么相比较的内容,传递给哪个命令的内容。

$sh -x prg.sh

$bash -x prg.sh

答案 1 :(得分: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

答案 2 :(得分:1)

[ $? ]相当于[ -n $? ],它将检查$?的扩展是否为非零长度的字符串,自$?扩展到退出时始终为真状态永远不会是空字符串。要检查值是否为零,请使用[$? -eq 0](( $? ))

除了更好用之外:

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

如果命令的退出状态为零,则执行命令并执行then部分;如果非零,则执行else部分。