전역 패턴과 숫자 일치

전역 패턴과 숫자 일치

일치를 위해 전역 패턴을 사용하려고 합니다. 그러나 이 게임은 실패합니다:

dgt='^+([0123456789])$'
[[ "$1" == $dgt  ]] && echo "SUCCESS" || echo "FAILURE"

답변1

패턴은 ^+([0123456789])$확장된 와일드카드 패턴과 정규 표현식의 혼합입니다. 와일드카드 패턴은 항상 고정되어 있으므로 명시적인 고정이 필요하지 않습니다. 따라서 ^시작하고 끝나는 와일드카드 패턴은 $문자열의 시작과 끝에 있는 리터럴 문자와 일치합니다. 와일드카드 패턴을 사용하고 ^시작과 끝이 일치 하지 않도록 하려면 $해당 패턴을 제거하세요.

다음 코드로 끝납니다.

#!/bin/bash

# Bash releases earlier than 4.1 needs to enable the extglob shell
# option.  For release 4.1+, the pattern used in [[ ]] is assumed
# to be an extended globbing pattern.
#
# shopt -s extglob

pattern='+([0123456789])'

if [[ $1 == $pattern ]]; then
   echo 'contains only digits'
else
   echo 'contains non-digit or is empty'
fi

확장된 와일드카드 패턴이 없는 셸에서는 숫자가 아닌 항목을 일치시키는 것이 더 쉽습니다.

#!/bin/sh

case $1 in
    *[!0123456789]*)
        echo 'contains non-digit' ;;
    '')
        echo 'is empty' ;;
    *)
        echo 'contains only digits'
esac

쉘 에서는 bash위의 코드를 이식 가능하고 sh호환되는 모든 쉘에서 작동하므로 사용할 수도 있습니다.

#!/bin/bash

pattern='*[!0123456789]*'

if [[ $1 == $pattern ]]; then
   echo 'contains non-digit'
elif [ -z "$1" ]; then
   echo 'is empty'
else
   echo 'contains only digits'
fi

답변2

전역 패턴 일치가 꼭 필요하지 않은 경우 정규식을 사용할 수도 있습니다.

=~Bash에서는 정규식 연산자를 사용할 수 있습니다 .

dgt='^[[:digit:]]+$'
[[ "$1" =~ $dgt ]] && echo "SUCCESS" || echo "FAILURE"

관련 정보