전역 일치 테스트 함수 작성

전역 일치 테스트 함수 작성

나는 고급 프로그래밍 언어로 함수를 작성하고 있는데 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/shAT&T ksh 기반 시스템에서.

관련 정보