我有以下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
答案 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。
根据该输出,您可以创建数据库并返回有意义的内容。