gpt4 book ai didi

bash - 从 Bash 检查 postgres 查询的结果

转载 作者:行者123 更新时间:2023-11-29 13:12:20 24 4
gpt4 key购买 nike

我在从 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 行)

以下是我对字符串条件检查的尝试:

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

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

最佳答案

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'

打印匹配。两点说明:Bash 在 [ ] 中使用时会理解 ==,但它不可移植,因此建议使用 =。此外,[ ] 不支持模式匹配,因此右侧末尾的 * 不会执行您期望的操作。 [[ ]]case 可用于模式匹配。

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

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

你的命令的返回值只是1,你可以比较

if [ "$userexists" = 1 ]; then

关于bash - 从 Bash 检查 postgres 查询的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53306212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com