일치를 위해 전역 패턴을 사용하려고 합니다. 그러나 이 게임은 실패합니다:
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"