我想验证我是否可以将数据库(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
我在哪里错过了什么?
答案 0 :(得分:5)
试试这个:
if [ $? -eq 0 ]
运行脚本时,使用-x
选项,该选项使用实际值打印出正在执行的每个命令。它对调试非常有用。您将看到与什么相比较的内容,传递给哪个命令的内容。
$sh -x prg.sh
或
$bash -x prg.sh
答案 1 :(得分:3)
请注意,如果您只是将$?
传递给test
([
的其他名称),则会扩展为字符串0
或2
,具体取决于命令是否成功。当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部分。