为什么这个Bash正则表达式匹配返回退出状态为“2”?

时间:2014-05-27 03:21:09

标签: regex bash posix

我正在编写一个Bash脚本,需要扫描文件名中是否存在非ASCII字符。我使用POSIX括号正则表达式语法来匹配非ASCII字符,但由于某种原因,当我在if / then语句中测试匹配时,测试总是返回退出状态2,并且从不匹配我的测试字符串。

以下是有问题的代码:

FILEREQ_SOURCEFILE="Filename–WithNonASćII-Charàcters-05sec_23.98.mov"
REGEX_MATCH_NONASCII="[^[:ascii:]]"

if [[ $FILEREQ_SOURCEFILE =~ $REGEX_MATCH_NONASCII ]]; then

        echo "Exit Status: $?"
        echo "Matched!"

    else
        echo "Exit Status: $?"
        echo "No Match"
fi

此代码始终返回:

Exit Status: 2
No Match

我已阅读并重新阅读了bash-hackers.org explanation正则表达式匹配的工作方式,以及this previous question关于匹配非ASCII字符的问题,但对于我的生活,我不能让这个工作。我在这里缺少什么?

我在Mac OS X 10.9.2上的Bash 3.2下运行。

1 个答案:

答案 0 :(得分:5)

bash(1)手册页 SHELL GRAMMAR 部分,复合命令子部分,[[ expression ]] subsubsection:

  

如果正则表达式在语法上不正确,则条件表达式的返回值为2.

来自regex(7)手册页:

  

标准字符类名称为:

          alnum   digit   punct
          alpha   graph   space
          blank   lower   upper
          cntrl   print   xdigit

没有" ascii"在那里。也许您应该尝试使用[\0-\x7f](或[^\0-\x7f]视情况而定)。