입력 문자열이 허용 목록에 있는 파일 경로와 일치하는지 확인한 다음 몇 가지 작업만 수행하고 싶습니다.
나는 이런 일을하고있다
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는 서로 다른 두 가지 패턴 언어입니다.
화이트리스트 패턴이 포함된 경우 $path1
RegEx에 다음과 같이 작성해야 합니다.
path1='^mydir/'
path2="mydir/testing"
[[ ${path2} =~ ${path1} ]] && echo "Matches"
오른쪽은 RegEx 변수 path1
이며 따옴표로 묶어서는 안 됩니다. 이렇게 하면 regexp 연산자(예: 위와 같은)가 문자 그대로 간주됩니다 ( option 또는 set 을 ^
설정하지 않는 한 ).compat31
BASH_COMPAT=3.1