bash脚本-检查输出中的特定字符串失败

bash脚本-检查输出中的特定字符串失败,bash,Bash,我有以下bash脚本: #!/bin/sh psql -U postgres -c "CREATE DATABASE test TEMPLATE template0;" if [ $? -eq 0 ]; then echo OK else if [ $? = 'ERROR: database "test" already exists' ]; then echo OK else echo FAIL fi fi 它当前失败,

我有以下bash脚本:

#!/bin/sh
psql -U postgres -c "CREATE DATABASE test TEMPLATE template0;"

if [ $? -eq 0 ]; then
    echo OK
else
    if [ $? = 'ERROR:  database "test" already exists' ]; then
         echo OK
    else
         echo FAIL
    fi
fi
它当前失败,出现以下错误:

testbox:/tmp# sh test.sh 
ERROR:  database "test" already exists
FAIL
我不确定哪里出了错。我需要它为这个特定错误返回“OK”。任何其他错误都应打印失败。 你能告诉我哪里出了问题吗

谢谢

编辑1

我修改了代码以捕获输出,而不仅仅是rc:

#!/bin/bash

output=$(psql -U postgres -c "CREATE DATABASE test TEMPLATE template0;")
ret=$?

if [[ $ret -eq 0 ]]; then
    echo OK
else
    if [[ $output == 'ERROR:  database "test" already exists' ]]; then
         echo OK
    else
         echo FAIL
    fi
fi
但我得到了这个错误:

ERROR:  database "test" already exists
sh: ERROR:  database "test" already exists: unknown operand
FAIL

$?
仅表示整数退出代码,而不是
psql
命令的输出。您需要获取
psql
命令的输出,并检查
if
条件

您可以使用:

#!/bin/bash

output=$(psql -U postgres -c "CREATE DATABASE test TEMPLATE template0;" 2>&1)
ret=$?

if [[ $ret -eq 0 ]]; then
    echo OK
else
    if [[ $output == *'already exists'* ]]; then
         echo OK
    else
         echo FAIL
    fi
fi

$?
将根据上次执行的命令的退出代码输出一个整数。
当数据库存在时,将返回
1
。这就是脚本失败的原因。

如果检查数据库是否存在,可以找到一种较短的方法


基于该输出,您可以创建数据库并返回一些有意义的内容。

$?
仅表示整数退出代码,而不是
psql
命令的输出。您需要获取输出并检查。@anubhava ok。你能给我举个例子吗?@Happydevdays:尝试在
psql
命令之后立即添加
echo$?
,你就会明白anubhava的意思(它只会打印一个数字,可能是“1”)。然后添加第二个
echo$?
,您将看到其中一个打印“0”,因为第一个
echo
命令成功,因此退出,状态代码为0。我已将第一行更改为
output=$(psql-U postgres-c“CREATE DATABASE test template0;”2>&1)
这样我们也可以从现在起作用的
psql
命令中捕获stderr。非常感谢。我可以用谷歌搜索什么来更好地理解第一行末尾的“2>&1”
2>&1
将stderr重定向到文件描述符
1
,它是
stdout
@Happydevdays是一个很好的资源。更具体地说,.@anubhava我有一个类似的问题,但是
返回代码总是0
content=$(java-jar${jarFilePath}-u${username},${password}-n${host}-c“${val_query}”)rc=$?
如果
val_query
有任何语法问题,那么我如何捕获错误