문자열 $string
이 glob 패턴과 일치 하는지 알고 싶습니다 $pattern
. $string
기존 파일의 이름 일 수도 있고 아닐 수도 있습니다. 어떻게해야합니까?
입력 문자열에 대해 다음 형식을 가정하십시오.
string="/foo/bar"
pattern1="/foo/*"
pattern2="/foo/{bar,baz}"
I는 어떨지 배시 관용구 찾고 싶은 $string
일치 할 것 $pattern1
, $pattern2
또는 다른 임의의 패턴을 글로브. 내가 지금까지 시도한 것은 다음과 같습니다.
[[ "$string" = $pattern ]]
이것은
$pattern
글로브 패턴이 아닌 문자열 패턴으로 해석되는 것을 제외하고 는 거의 작동합니다 .[ "$string" = $pattern ]
이 방법의 문제점
$pattern
은 확장 된 다음$string
의 확장과 확장 간에 문자열 비교가 수행 된다는 것 입니다$pattern
.[[ "$(find $pattern -print0 -maxdepth 0 2>/dev/null)" =~ "$string" ]]
이것은
$string
존재 하지만 존재하는 파일이 들어있는 경우에만 작동 합니다.[[ $string =~ $pattern ]]
=~
연산자가$pattern
glob 또는 와일드 카드 패턴이 아닌 확장 된 정규식으로 해석 되므로 작동하지 않습니다 .
ls /foo/*
당신이에 일치시킬 수 해주기
foo/{bar,baz}
실제로 foo/*
경로 이름 확장 인 동안 실제로 매개 변수 확장이 아닌 중괄호 확장 이라는 것을 알았습니다 . $string
매개 변수 확장입니다. 이들은 모두 다른 시간과 다른 메커니즘으로 수행됩니다.
case
명령문은 Bash 매뉴얼에 따라 경로 이름 확장 ( "globbing")을 수행합니다.
{bar,baz}
는 패턴이 아니라는 것입니다. 매개 변수 확장입니다. 점에서 미묘하지만 중요한 차이는{bar,baz}
여러 인수에 매우 초기에 확대되어bar
및baz
.