【问题标题】:bash script - check for specific string in output is failingbash 脚本 - 检查输出中的特定字符串失败
【发布时间】:2016-12-22 15:19:31
【问题描述】:

我有以下 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”。任何其他错误都应打印出 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

但我得到这个错误:

ERROR:  database "test" already exists
sh: ERROR:  database "test" already exists: unknown operand
FAIL

【问题讨论】:

  • $? 仅代表整数退出代码,而不是您的 psql 命令的输出。您需要获取输出并检查。
  • @anubhava 好的。可以举个例子吗?
  • @Happydevdays:尝试在psql 命令之后立即添加echo $?,您会看到anubhava 的含义(它只会打印一个数字,可能是“1”)。然后添加第二个echo $?,您会看到一个打印“0”,因为第一个echo 命令成功,因此以状态码0 退出。

标签: bash


【解决方案1】:

$? 仅代表整数退出代码,而不是 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

【讨论】:

  • 我已将第一行更改为output=$(psql -U postgres -c "CREATE DATABASE test TEMPLATE template0;" 2>&1),以便我们也可以从psql 命令中捕获stderr
  • 现在可以了。谢谢你。我可以用谷歌搜索什么来更好地理解第一行末尾的“2>&1”?
  • 2>&1 将 stderr 重定向到文件描述符 1stdout
  • @Happydevdays The Linux Documentation Project 是一个很好的资源。 Beginner's guideAdvanced guide。更具体地说,the I/O redirection topic you're asking about.
  • @anubhava 我也有类似的问题,但是return code is always 0 content=$(java -jar ${jarFilePath} -u ${username},${password} -n ${host} -c "${val_query}") rc=$? 如果val_query 有任何语法问题,那么我该如何捕获错误
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 2017-03-10
      相关资源
      最近更新 更多