Конец конвейера, когда программа возвращает более 1 строки

Конец конвейера, когда программа возвращает более 1 строки

Я запрашиваю базу данных mysql для имени базы данных по шаблону. В настоящее время моя реализация выглядит так:

include_databases=$(mysql --batch --skip-column-names --execute "SHOW DATABASES LIKE 'foo%'" \
    | paste -sd ",")

Что вернет разделенный запятыми список имен баз данных, соответствующих шаблону.

Однако на самом деле я ожидаю, что будет возвращено только одно имя базы данных, и думаю, что было бы лучше выдать ошибку, когда mysql возвращает результат с 2 строками.

Есть что-то вроде:

include_databases=$(mysql --batch --skip-column-names --execute "SHOW DATABASES LIKE 'foo%'" \
    | __error_if_two_lines__ )

решение1

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

решение2

Я думаю, wcэто твой друг. Используйте опцию -lдля подсчета строк, -wдля подсчета слов. (см. страницу руководства)

mysql --batch --skip-column-names --execute "SHOW DATABASES" | wc -w

показывает количество баз данных.

например что-то вроде этого

include_databases=$(mysql --batch --skip-column-names --execute "SHOW DATABASES")
numDB=$(echo $include_databases | wc -w)
[ $numDB -gt 1 ] && echo -n "$numDB dbs is more than "
echo "one db"

Подсказка: Вам следует улучшить этот скрипт, так как он использует много подшаблонов.

Связанный контент