代码之家  ›  专栏  ›  技术社区  ›  Luc M

我用美元吗?正确地?

  •  1
  • Luc M  · 技术社区  · 14 年前

    我想验证是否可以将数据库(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 回复  |  直到 14 年前
        1
  •  3
  •   Brian Campbell Dennis Williamson    14 年前

    注意,如果你只是通过 $? test (另一个名字是 [ ),将扩展到字符串 0 2 取决于命令是否成功。什么时候? 测试 0

    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
  •  5
  •   codaddict    14 年前

    试试这个:

    if [ $? -eq 0 ]
    

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

    $sh -x prg.sh
    

    $bash -x prg.sh
    
        3
  •  1
  •   Bart Sas    14 年前

    [ $? ] [ -n $? ] 这将检查 $? 是一个长度非零的字符串,自 $? 扩展到一个永远不会是空字符串的退出状态。为了检查值是否为零,请使用 [$? -eq 0] (( $? )) .

    此外,最好使用:

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

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