bash脚本-检查输出中的特定字符串失败
我有以下bash脚本:bash脚本-检查输出中的特定字符串失败,bash,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 它当前失败,
#!/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
$?
仅表示整数退出代码,而不是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
。这就是脚本失败的原因。如果检查数据库是否存在,可以找到一种较短的方法
基于该输出,您可以创建数据库并返回一些有意义的内容。
$?
仅表示整数退出代码,而不是psql
命令的输出。您需要获取输出并检查。@anubhava ok。你能给我举个例子吗?@Happydevdays:尝试在psql
命令之后立即添加echo$?
,你就会明白anubhava的意思(它只会打印一个数字,可能是“1”)。然后添加第二个echo$?
,您将看到其中一个打印“0”,因为第一个echo
命令成功,因此退出,状态代码为0。我已将第一行更改为output=$(psql-U postgres-c“CREATE DATABASE test template0;”2>&1)
这样我们也可以从现在起作用的psql
命令中捕获stderr。非常感谢。我可以用谷歌搜索什么来更好地理解第一行末尾的“2>&1”2>&1
将stderr重定向到文件描述符1
,它是stdout
@Happydevdays是一个很好的资源。更具体地说,.@anubhava我有一个类似的问题,但是返回代码总是0
content=$(java-jar${jarFilePath}-u${username},${password}-n${host}-c“${val_query}”)rc=$?
如果val_query
有任何语法问题,那么我如何捕获错误