我有以下 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)
$?仅代表整数退出代码而不是命令的输出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)