我编写了以下脚本来测试“可打印字符”字符类,如
here所述.
#!/bin/sh case "foo" in *[:print:]*) echo "found a printable character" ;; *) echo "found no printable characters" ;; esac
我希望这个脚本输出找到一个可打印的字符,“foo”中至少有一个(实际上是所有)字符是可打印的.相反,它输出“找不到可打印的字符”.为什么“foo”中的字符不被识别为可打印字符?
解决方法
字符串[:仅在括号表达式中是特殊的,括号表达式本身由[引入].所以你的榜样应该是:
case "foo" in *[[:print:]]*) echo "found a printable character" ;; *) echo "found no printable characters" ;; esac
如果这看起来很麻烦,请考虑一下如何指定一个应该匹配小写字母或数字而不是大写字母的模式.
有关更多信息,请参阅section of the POSIX spec detailing bracket expressions in regular expressions. shell模式中的Bracket表达式与正则表达式中的括号表达式类似,但处理的除外!和^. (尽管在括号表达式的上下文之外,shell模式和正则表达式之间存在其他差异).