grep: синтаксис класса символов: [[: space:]], а не [: space:] - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь получить список всех баз данных на моем сервере, которые я буду использовать для резервного копирования.Ниже приведен фрагмент кода, который я пытаюсь напечатать в списке баз данных, но получаю ошибку.Как это исправить?Добавление двойных квадратных скобок не решает эту проблему.

Я рассмотрел некоторые подобные вопросы, но не могу понять.

grep: синтаксис класса символов: [[:пробел:]], а не [: пробел:]

#!/bin/sh -

IFS='
        '
OLDPATH="$PATH"

PATH=/sbin:/bin:/usr/bin
export PATH

MUSER=root
MPASS='sfdsfdf'

DBLIST=$(mysql -u${MUSER} -p${MPASS} -e 'show databases;' |  grep [:alphnum:] | grep -v Database)
for base in ${DBLIST}; do
    echo $base
done

1 Ответ

0 голосов
/ 10 февраля 2019

Строка, вызывающая ошибку:

DBLIST=$(mysql -u${MUSER} -p${MPASS} -e 'show databases;' |\
grep [:alphnum:] | grep -v Database)

Когда запускается первый grep, он замечает, что между двоеточиями есть пара скобок, содержащих текст.Предполагается, что пользователь намеревался поместить класс символов в выражение в скобках, и приводит пример правильного способа сделать это.

Выражение в скобках записывается [ список символов ].

Класс символов записывается: [: class :] для некоторого значения класса.

Класс символов (например, [:space:]) используется путем помещения его в выражение в скобках вместе с любыми другими символами, которые должны быть сопоставлены.Таким образом, чтобы сопоставить пробел и цифры от одной до трех, можно написать: [[:space:]123]

К сожалению, в коде есть еще одна ошибка, заключающаяся в том, что нет такого класса символов, как "alphnum".Таким образом, исправление брекетинга не помогает!

Однако существует класс: [:alnum:]

Если этот класс предназначен, первый grep должен быть изменен на:

grep [[:alnum:]]

Обратите внимание, что оболочка обрабатывается специально оболочкой (они могут расширяться до имен файлов), поэтому безопаснее заключать в кавычки любые случаи:

grep '[[:alnum:]]'
...