为什么POSIX中的“可打印字符”类不能匹配一个简单字符串?

4
我编写了以下脚本来测试“可打印字符”字符类,如这里所述。
#!/bin/sh

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

我期望这个脚本输出找到可打印字符,因为"foo"中的所有字符都是可打印字符。然而,它输出了"未找到可打印字符"。为什么"foo"中的字符不能被识别为可打印字符?

1个回答

8
字符串[:只在方括号表达式内部才有特殊含义,而方括号表达式本身由[引入。因此,您的示例应该是:
case "foo" in
    *[[:print:]]*) echo "found a printable character" ;;
    *) echo "found no printable characters" ;;
esac

如果这看起来很繁琐,那么想一想如何指定一个模式,它应该匹配小写字母或数字,但不匹配大写字母。
有关更多信息,请参见 POSIX规范中详细介绍正则表达式中括号表达式的部分。Shell模式中的括号表达式类似于正则表达式中的括号表达式,除了对!^的处理方式。(虽然在括号表达式之外,shell模式和正则表达式还存在其他差异)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接