为什么POSIX"可打印字符"类与简单字符串不匹配?

Mat*_*hew 4 regex linux shell posix non-printable

我写了下面的脚本来测试"可打印字符"字符类,如所描述这里.

#!/bin/sh

case "foo" in
    *[:print:]*) echo "found a printable character" ;;
    *) echo "found no printable characters" ;;
esac
Run Code Online (Sandbox Code Playgroud)

我希望这个脚本输出found a printable character,至少有一个(实际上是所有)字符"foo"是可打印的.相反,它输出"found no printable characters".为什么字符"foo"不被识别为可打印字符?

Jam*_*man 8

该字符串[:括号表达式中是特殊的,括号表达式本身是由引入的[.所以你的榜样应该是:

case "foo" in
    *[[:print:]]*) echo "found a printable character" ;;
    *) echo "found no printable characters" ;;
esac
Run Code Online (Sandbox Code Playgroud)

如果这看起来很麻烦,请考虑一下如何指定一个应该匹配小写字母或数字而不是大写字母的模式.

有关更多信息,请参阅正则表达式中详细说明括号表达式的POSIX规范部分.shell模式中的Bracket表达式就像正则表达式中的括号表达式一样,除了!和和的处理^.(尽管在括号表达式的上下文之外,shell模式和正则表达式之间存在其他差异).