나는 고급 프로그래밍 언어로 함수를 작성하고 있는데 wildcardMatch(input, pattern)
, 그것이 Unix의 glob 일치와 정확히 동일하게 작동하기를 원합니다.
이를 위해 저는 속성 기반 테스트를 사용하여 무작위 입력을 생성하고 이를 구현과 Unix 구현에 대해 테스트한 다음 반환 값이 동일한지 비교했습니다.
내 문제는 간단한 Unix 도우미 스크립트를 신뢰하지 않는다는 것입니다.
#!/bin/bash
## Created for development/testing
##
## Example Usage:
## ./wildcard_test.sh "foobar" "fooba*"
string=$1
pattern=$2
if [[ $string == $pattern ]]; then
echo 0
exit 0
else
echo 1
exit 1
fi
스크립트가 실제로 실행되기 전에 확장이 발생한다는 사실을 알기 전까지는 모든 것이 잘 작동했습니다.
./wildcart_test.sh "foo" "???"
이 예에서는 물음표가 확장되어 디렉터리의 다른 파일과 실제로 일치하므로 ==
비교가 실패하게 됩니다. lib
예를 들어 이 경우에는 .
전역 일치를 테스트하는 더 좋은 방법이 있습니까?
답변1
아니요,
./wildcart_test.sh "foo" "???"
인용 한 대로 ???
문제가 없으므로 쉘에 의해 확장되지 않습니다. 그러나 큰따옴표 안의 \
, 및 문자는 $
여전히 특별합니다. `
Bourne과 같은 쉘에서는 특수 문자 없이 작은따옴표를 사용할 수 있습니다.
하지만 여기서 할 수 있는 한 가지는 종속성을 제거 하고 이를 수행하기 위해 bash
표준 구문을 사용하는 것입니다 .sh
#! /bin/sh -
subject=${1?No subject} pattern=${2?No pattern}
case $subject in
($pattern) echo 1; true;;
(*) echo 0; false;;
esac
참고하시기 바랍니다.0
종료 상태true를 나타내며 0을 사용하는 것이 더 일반적입니다.숫자거짓이고, 0이 아닌 것은 참입니다.
그러나 sh
이식성을 위해서는 아직 표준이 아니기 때문에 [^x]
로 작성해야 합니다 .[!x]
[^x]
\
패턴 일치 코드에서 in이 특별히 처리되는지 여부 $pattern
도 구현 및 버전에 따라 다릅니다. that-script '\foo' '\*'
어떤 경우에는 false를 반환하고 다른 경우에는 true를 반환할 수 있습니다. 에 대해서도 마찬가지입니다 that-script '*' '\*'
.
리터럴 백슬래시를 일치시키려면 를 사용하십시오 that-script '\foo' '[\\]*'
. 와일드카드( ?
, *
, [
)를 일치시키려면 that-script '*?[' '[*][?][[]'
. 또한 Bourne 쉘과 그 하위 항목(ksh88, ksh93)의 버그/버기 기능에 유의하세요. 둘 다 반환 that-script a '[a]'
됩니다.that-script '[a]' '[a]'
진짜/bin/sh
AT&T ksh 기반 시스템에서.