
Estoy consultando en una base de datos mysql el nombre de una base de datos por patrón. Actualmente mi implementación se ve así:
include_databases=$(mysql --batch --skip-column-names --execute "SHOW DATABASES LIKE 'foo%'" \
| paste -sd ",")
Lo que devolverá una lista separada por comas de nombres de bases de datos que coincidieron con el patrón.
Sin embargo, en realidad solo espero que se devuelva un nombre de base de datos y creo que sería mejor cometer un error cuando MySQL devuelva un resultado con 2 líneas.
¿Hay algo como:
include_databases=$(mysql --batch --skip-column-names --execute "SHOW DATABASES LIKE 'foo%'" \
| __error_if_two_lines__ )
Respuesta1
Puedes usar head
para extraer la primera línea:
include_databases=$(… | head -n 1)
Sin embargo, esto ignorará silenciosamente cualquier línea adicional. Puedes usar awk en su lugar para devolver un código de salida diferente si hay más líneas:
include_databases=$(… | awk 'NR>1 {exit(2)} 1')
if [ $? -ne 0 ]; then
echo >&2 'mysql returned multiple lines! Aborting.'; exit 2;;
fi
O debajo set -e
:
include_databases=$(… | awk 'NR>1 {print "mysql returned multiple lines! Aborting." >"/dev/stderr"; exit(2)} 1')
Alternativamente, puede almacenar la salida en una variable y probar si contiene un salto de línea. (Tenga en cuenta que la nueva línea final del comando no se incluye en la sustitución del comando).
include_databases=$(…)
nl='
'
case $include_databases in
*"$nl"*) echo >&2 'mysql returned multiple lines! Aborting.'; exit 2;;
esac
En ksh/bash/zsh, pero no en sh simple, puedes escribir esto de una manera más compacta.
include_databases=$(…)
if [[ "$include_databases" = *$'\n'* ]]; then
echo >&2 'mysql returned multiple lines! Aborting.'; exit 2;;
esac
Respuesta2
Creo que wc
es tu amigo. Utilice la opción -l
para contar líneas, -w
para contar palabras. (ver página de manual)
mysql --batch --skip-column-names --execute "SHOW DATABASES" | wc -w
muestra el número de bases de datos.
por ejemplo, algo como esto
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"
Sugerencia: deberías mejorar este script, porque utiliza muchos subcapas.