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

时间:2019-02-10 01:47:53

标签: linux shell grep sh

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

我已经调查了一些类似的问题,但我不知道。

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

1 个答案:

答案 0 :(得分:3)

产生错误的行是:

MediaSource

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

方括号表达式是DBLIST=$(mysql -u${MUSER} -p${MPASS} -e 'show databases;' |\ grep [:alphnum:] | grep -v Database) 字符列表 [

编写一个字符类:] [:,以获取类的某些值。

通过将字符类(例如:])放置在方括号表达式内 来使用该字符类以及任何其他要匹配的字符。因此,要匹配空格和数字到1到3,可以写一个:[:space:]

不幸的是,代码中还有另一个错误,那就是没有像“字母”这样的字符类。因此,纠正包围没有帮助!

但是有一个类:[[:space:]123]

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

[:alnum:]

请注意,括号由外壳程序特殊对待(它们可以扩展为文件名),因此引用任何出现的位置都更安全:

grep [[:alnum:]]