Bash脚本-检查输出中是否存在特定字符串失败。

3
我有以下的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

目前它出现了以下错误:

testbox:/tmp# sh test.sh 
ERROR:  database "test" already exists
FAIL

我不确定我哪里出错了。我需要返回“OK”来表明这个特定的错误,其他任何错误都应该输出FAIL。 你能告诉我我哪里出错了吗?
谢谢。
编辑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

2
"$?" 仅代表整数退出代码,而不是您的 psql 命令的输出。 您需要获取输出并进行检查。 - anubhava
@anubhava 好的。你能给我一个例子吗? - Happydevdays
1
@Happydevdays:尝试在psql命令之后立即添加echo $?,你就会明白anubhava的意思了(它只会打印一个数字,可能是“1”)。然后再添加第二个echo $?,你会发现其中一个打印“0”,因为第一个echo命令成功执行,因此以状态码0退出。 - Gordon Davisson
3个回答

5

$? 表示的只是整数退出码,而不是你的 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

我已将第一行更改为output=$(psql -U postgres -c“CREATE DATABASE test TEMPLATE template0;”2>&1),以便我们还可以捕获psql命令的stderr。 - anubhava
1
现在它有效了。谢谢你。我需要搜索什么才能更好地理解第一行结尾处的“2>&1”? - Happydevdays
2>&1 redirects stderr to file descriptor 1 which is stdout - anubhava
1
@Happydevdays Linux文档项目是一个很好的资源。初学者指南高级指南。更具体地说,你正在询问的I/O重定向主题 - TTT
@anubhava 我遇到了类似的问题,但是“返回代码始终为0” content=$(java -jar ${jarFilePath} -u ${username},${password} -n ${host} -c "${val_query}") rc=$? 如果 val_query 存在语法问题,我该如何捕获错误? - nmr

0

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


0

检查数据库是否存在的更简短的方法可以在这里找到。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接