
Я запрашиваю базу данных 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"
Подсказка: Вам следует улучшить этот скрипт, так как он использует много подшаблонов.