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

时间:2016-12-22 15:19:32

标签: 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”。任何其他错误都应打印出失败。 你能告诉我哪里出错了吗?

感谢。

编辑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

3 个答案:

答案 0 :(得分:4)

$?仅表示整数退出代码,而不是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 :(得分:0)

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

答案 2 :(得分:0)

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

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