Вы можете использовать head
для извлечения первой строки:
include_databases=$(… | head -n 1)
Однако это будет молча игнорировать любые последующие строки. Вместо этого вы можете использовать awk, чтобы вернуть другой код выхода, если строк больше:
include_databases=$(… | awk 'NR>1 {exit(2)} 1')
if [ $? -ne 0 ]; then
echo >&2 'mysql returned multiple lines! Aborting.'; exit 2;;
fi
Или в set -e
:
include_databases=$(… | awk 'NR>1 {print "mysql returned multiple lines! Aborting." >"/dev/stderr"; exit(2)} 1')
В качестве альтернативы вы можете сохранить вывод в переменной и проверить, он содержит разрыв строки. (Обратите внимание, что последняя новая строка команды не включена в подстановку команды.)
include_databases=$(…)
nl='
'
case $include_databases in
*"$nl"*) echo >&2 'mysql returned multiple lines! Aborting.'; exit 2;;
esac
В ksh/bash/zsh, но не в простом sh, вы можете написать это более компактно.
include_databases=$(…)
if [[ "$include_databases" = *$'\n'* ]]; then
echo >&2 'mysql returned multiple lines! Aborting.'; exit 2;;
esac