Проверка результата запроса postgres от Bash - PullRequest
0 голосов
/ 14 ноября 2018

У меня проблемы с анализом выходных данных sql-запроса postgres из bash-скрипта.

Вот вывод из запроса командной строки к 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 голосов
/ 14 ноября 2018

Содержимое 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...