Bash Shell模式匹配测试

Bash Shell模式匹配测试,你不想对字符串进行字面匹配,而是想看看它是否符合某种模式。例如,想知道是否存在 JPEG 类型的文件。

解决方案

在 if 语句中使用复合命令 [[ ]],以便在等量运算符右侧启用 shell 风格的模式匹配:

if [[ "${MYFILENAME}" == *.jpg ]]

讨论

[[ ]] 语法不同于 test 命令的老形式 [,它是一种较新的 bash 机制(2.01 版左右才出现)。能够在 [ ] 中使用的运算符也可用于 [[ ]],但在后者中,等号是一种更为强大的字符串比较运算符。就像我们一样,你也可以使用 = 或 ==,两者在语义上相同。我们偏好 ==(尤其是进行模式匹配时),这样更加醒目,但模式匹配功能可不是因此而有的,它源于复合命令 [[ ]]

标准模式匹配包括 *(匹配任意数量的字符)、?(匹配单个字符)以及 [ ](匹配字符列表中的任意一个)。注意,其写法类似于 shell 文件通配符,但和正则表达式可不是一回事。

如果进行模式匹配,就别把模式放入引号。否则,就只能匹配到以星号为首的字符串 。

也就是说,按照模式字符串的字面意义进行匹配。

通过启用某些 bash 选项,可以使用一些更为强大的模式匹配功能。我们来扩展一下之前的例子,要求其查找以 .jpg 或 .jpeg 结尾的文件名。可以这么做:

shopt -s extglob
if [[ "$FN" == *.@(jpg|jpeg) ]]
then
    # 余下的处理

shopt -s 命令可以打开 shell 选项。extglob 选项涉及扩展模式匹配(或通配符匹配)。借助扩展模式匹配,我们可以使用多个模式,彼此之间用 | 字符分隔并通过括号分组。括号之前的 @ 字符表示仅匹配括号中的模式一次。下表列出了所有的扩展模式匹配。

Bash Shell模式匹配测试

匹配区分大小写,不过可以用 shopt -s nocasematch(适用于 bash 3.1 以上版本)改变这种行为。该选项会影响到 case 和 [[ 命令。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!