Bash: 파일 경로 비교를 위한 정규식

Bash: 파일 경로 비교를 위한 정규식

입력 문자열이 허용 목록에 있는 파일 경로와 일치하는지 확인한 다음 몇 가지 작업만 수행하고 싶습니다.

나는 이런 일을하고있다

path1="mydir/**"
path2="mydir/testing"

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

경로가 다음과 같은 경우

mydir/test/dir
mydir/othertest/dir

이것들은 통과되어야 합니다.

위 수표에서 오류가 발생했습니다.

assets/bin/copymain: line 8: [: too many arguments

답변1

특정 방식으로 끝나거나 시작하는 경로/문자열을 비교하는 것이 유일한 요구 사항이라면 정규 표현식이 필요하지 않습니다.

d1=mydir/test/dir
d2=mydir/othertest/dir
d3=mydir-2/test/dir-2

[[ "$d1" == mydir/* ]] && echo matches
[[ "$d2" == mydir/* ]] && echo matches
[[ "$d3" != mydir/* ]] && echo no-match

[[ "$d1" == */dir ]] && echo matches
[[ "$d2" == */dir ]] && echo matches
[[ "$d3" != */dir ]] && echo no-match

답변2

path1="mydir/**"
path2="mydir/testing"

여기서는 path1="mydir/**"비교에 사용된 확장 RegEx와 완전히 다른 언어인 글로빙 패턴 마녀를 사용합니다.

[ [ "$path2" =~ "$path1" ] ] && echo "Matches"

그러나 조건은 RegEx를 사용합니다.

[[ "$path2" =~ "$path1" ]]

[ [and 사이 에 공백을 추가하지 마십시오 ] ].[[]]

매개변수 확장 글로빙과 Regex는 서로 다른 두 가지 패턴 언어입니다.

화이트리스트 패턴이 포함된 경우 $path1RegEx에 다음과 같이 작성해야 합니다.

path1='^mydir/'
path2="mydir/testing"

[[ ${path2} =~ ${path1} ]] && echo "Matches"

오른쪽은 RegEx 변수 path1이며 따옴표로 묶어서는 안 됩니다. 이렇게 하면 regexp 연산자(예: 위와 같은)가 문자 그대로 간주됩니다 ( option 또는 set 을 ^설정하지 않는 한 ).compat31BASH_COMPAT=3.1

관련 정보