입력 문자열이 허용된 파일 경로와 일치하는지 확인한 다음 몇 가지 작업만 수행하고 싶습니다.
나는 이런 일을하고있다
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/**"
비교에 사용된 확장 정규식과 완전히 다른 언어입니다.
[ [ "$path2" =~ "$path1" ] ] && echo "Matches"
그러나 조건은 정규식을 사용합니다.
[[ "$path2" =~ "$path1" ]]
[ [
과 사이에 공백을 추가하지 ] ]
마십시오 [[
.]]
매개변수 확장 와일드카드와 정규식은 서로 다른 두 가지 패턴 언어입니다.
화이트리스트 패턴을 포함하는 경우 $path1
정규식에 다음과 같이 작성해야 합니다.
path1='^mydir/'
path2="mydir/testing"
[[ ${path2} =~ ${path1} ]] && echo "Matches"
오른쪽에는 path1
따옴표로 묶을 수 없는 RegEx 변수가 있습니다. 이렇게 하면 위와 같은 정규식 연산자가 문자 그대로 인식됩니다 ( option 또는 set 을 ^
설정하지 않는 한 ).compat31
BASH_COMPAT=3.1