如果有条件,bash中奇怪的正则表达式行为

时间:2019-10-22 12:42:23

标签: regex bash

我写了一个小脚本,它循环遍历目录(从给定的参数目录开始),并提示其中包含xml文件的目录。这是我的代码:

#! /bin/bash

process()
{
    LIST_ENTRIES=$(find $1 -mindepth 1 -maxdepth 1)

    regex="\.xml"
    if [[ $LIST_ENTRIES =~ $regex ]]; then
        echo "$1"
    fi  

    # Process found entries
    while read -r line
    do
        if [[ -d $line ]]; then
            process $line
        fi  
    done <<< "$LIST_ENTRIES"
}

process $1

此代码可以正常工作。但是,如果我将正则表达式更改为\.xml$以指示它应该在行尾匹配,则结果会有所不同,并且我不会获得所有正确的目录。

这有什么问题吗?

1 个答案:

答案 0 :(得分:1)

您的变量LIST_ENTRIES可能没有.xml作为最后一个条目。

要进行验证,请尝试echo $LIST_ENTRIES

要解决此问题,请在for周围使用if

process()
{
    LIST_ENTRIES=$(find $1 -mindepth 1 -maxdepth 1)

    regex="\.xml$"

    for each in $LIST_ENTRIES; do
      if [[ $each =~ $regex ]]; then
          echo "$1"
      fi
    done

    # Process found entries
    while read -r line
    do
        if [[ -d $line ]]; then
            process $line
        fi  
    done <<< "$LIST_ENTRIES"
}

process $1