1

我正在尝试获取服务器上用于备份的所有数据库的列表。以下是我试图打印数据库列表但出现错误的代码片段。如何解决?添加双方括号并不能解决它。

我已经研究了一些类似的问题,但我无法弄清楚。

grep:字符类语法是 [[:space:]],而不是 [:space:]

#!/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
4

1 回答 1

5

产生错误的行是:

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

当第一个 grep 运行时,它注意到冒号之间有一对包含文本的括号。它猜测用户打算将字符类放在括号表达式中,并给出了正确方法的示例。

括号表达式是[字符列表]

写了一个字符类:[::]的一些值。

通过将字符类(例如[:space:])与要匹配的任何其他字符一起放在括号表达式中来使用字符类。因此,要匹配空格和数字一到三,可以这样写:[[:space:]123]

不幸的是,代码中还有一个错误,就是没有“alphnum”这样的字符类。所以纠正括号没有帮助!

但是有一个类:[:alnum:]

如果这是预期的类,则应将第一个 grep 修改为:

grep [[:alnum:]]

请注意,括号是由 shell 特殊处理的(它们可以扩展为文件名),因此引用任何出现的地方都更安全:

grep '[[:alnum:]]'
于 2019-02-10T02:49:27.393 回答