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

Hap*_*ays 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
Run Code Online (Sandbox Code Playgroud)

目前失败并出现以下错误:

testbox:/tmp# sh test.sh 
ERROR:  database "test" already exists
FAIL
Run Code Online (Sandbox Code Playgroud)

我不确定我哪里出错了。我需要它针对这个特定错误返回“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
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

ERROR:  database "test" already exists
sh: ERROR:  database "test" already exists: unknown operand
FAIL
Run Code Online (Sandbox Code Playgroud)

anu*_*ava 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
Run Code Online (Sandbox Code Playgroud)