Содержимое 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