我在从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
数据库用户中的所有结果都不存在。
答案 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