4

我编写了以下脚本来测试“可打印字符”字符类,如此所述。

#!/bin/sh

case "foo" in
    *[:print:]*) echo "found a printable character" ;;
    *) echo "found no printable characters" ;;
esac

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

4

1 回答 1

8

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

case "foo" in
    *[[:print:]]*) echo "found a printable character" ;;
    *) echo "found no printable characters" ;;
esac

如果这看起来很麻烦,请考虑例如如何指定应该匹配小写字母或数字但不匹配大写字母的模式。

有关详细信息,请参阅POSIX 规范中详细说明正则表达式中括号表达式的部分。shell 模式中的括号表达式类似于正则表达式中的括号表达式,除了对!and的处理^。(尽管在括号表达式的上下文之外,shell 模式和正则表达式之间还有其他区别)。

于 2012-04-17T00:19:51.650 回答