从Bash检查Postgres查询的结果

时间:2018-11-14 17:57:39

标签: bash postgresql

我在从bash脚本解析postgres sql查询的输出时遇到问题。

这是命令行查询到postgres的输出:

root@API:/home# psql -U postgres -h pgipaddress -c "SELECT 1 AS __ROW__ FROM pg_roles WHERE rolname='postgres'"
 __row__ 
---------
       1
(1 row)

在查看条件之前,这里是变量$userexists的样子:

__row__ --------- 1 (1 row)

这是我进行字符串条件检查的尝试:

userexists=$(psql -U postgres -h ${pgip} -c "SELECT 1 AS __ROW__ FROM pg_roles WHERE rolname='postgres'")
if [ "${userexists}" == "__row__\n---------\n1 \n(1 row)"* ] ; then
  printf "Database User exists\n"
else
  printf "Database User does not exists\n"
fi

userexists=$(psql -U postgres -h ${pgip} -c "SELECT 1 AS __ROW__ FROM pg_roles WHERE rolname='postgres'")
if [ "${userexists}" == "__row__ --------- 1 (1 row)"* ] ; then
  printf "Database User exists\n"
else
  printf "Database User does not exists\n"
fi

数据库用户中的所有结果都不存在。

1 个答案:

答案 0 :(得分:1)

userexists的内容可能实际上包含换行符,但是您可能使用未引号的扩展名检查了内容:

# Assignment
$ userexists=' __row__
---------
       1
(1 row)'

$ echo "$userexists"  # Quoted expansion
 __row__
---------
       1
(1 row)

$ echo $userexists    # Unquoted expansion squashes whitespace
__row__ --------- 1 (1 row)

此外,如果要比较两个包含换行符的字符串与[ ... ],则不能使用"\n"插入换行符。 ANSI-C转义$'\n'将起作用:

var='has
linebreak'
[ "$var" = $'has\nlinebreak' ] && echo 'Match'

打印Match。有两个要点:Bash在==中使用时会理解[ ],但它不是可移植的,因此建议使用=。另外,[ ]不支持模式匹配,因此位于右侧末尾的*不能满足您的期望。 [[ ]]case可用于模式匹配。

首先要避免整个问题,可以为psql提供一些标志,具体来说:

  • --quiet –无信息输出
  • -t –仅元组;没有列名,结果计数页脚等。
  • -A –未对齐的输出(从行中删除前导空白)

,命令返回的就是1,您可以与之比较

if [ "$userexists" = 1 ]; then