Завершить конвейер, когда программа возвращает более одной строки

Давайте поиграем с учитель:

$ a="anna";diff -sq <(echo "$a") <(echo "$a" |rev)
Files /dev/fd/63 and /dev/fd/62 are identical

$ a="arrna";diff -sq <(echo "$a") <(echo "$a" |rev)
Files /dev/fd/63 and /dev/fd/62 differ

Заключение: Если слово является палиндромом, diff сообщит вам об этом.

Если вы еще не знакомы с заменой процессов, то

$ a="anna" && echo "$a" >normal.txt && echo "$a" |rev >reverse.txt
$ diff -sq normal.txt reverse.txt
1
22.05.2017, 04:40
2 ответа

Вы можете использовать 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
1
27.01.2020, 23:45

Я думаю 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"

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

0
27.01.2020, 23:45

Теги

Похожие вопросы