정규식 주위에 큰 [[]]
따옴표 :digit:
와 작은따옴표를 사용하여 숫자를 테스트하는 올바른 방법입니까?
if [[ "$var" =~ '^[[:digit:]]+$' ]]; then
답변1
이는 사실이 아니며, 간단한 테스트를 통해 다음을 확인할 수 있습니다.
#!/bin/bash
for var in 1 2 3 a b c; do
if [[ "$var" =~ '^[[:digit:]]+$' ]]; then
echo "$var is a number"
else
echo "$var is NOT a number"
fi
done
위 명령을 실행하면 다음이 생성됩니다.
1 is NOT a number
2 is NOT a number
3 is NOT a number
a is NOT a number
b is NOT a number
c is NOT a number
자동으로 실행되는 편집기가 있거나 shellcheck
코드를 붙여넣는 경우https://shellcheck.net/, 다음 오류가 표시됩니다.
Line 4:
if [[ "$var" =~ '^[[:digit:]]+$' ]]; then
^-- SC2076 (warning): Remove quotes from right-hand side of =~ to match as a regex rather than literally.
이는 우리가 다음과 같이 작성해야 함을 알려줍니다.
#!/bin/bash
for var in 1 2 3 a b c; do
if [[ "$var" =~ ^[[:digit:]]+$ ]]; then
echo "$var is a number"
else
echo "$var is NOT a number"
fi
done
다음을 생성합니다.
1 is a number
2 is a number
3 is a number
a is NOT a number
b is NOT a number
c is NOT a number
이 내용은 다음과 같이 기록됩니다.배쉬 매뉴얼 페이지:
== 및 !=와 우선순위가 동일한 추가 이항 연산자 =~를 사용할 수도 있습니다. 사용 시 연산자 오른쪽의 문자열은 POSIX 확장 정규식으로 처리되어 그에 따라 일치됩니다.패턴의 일부가 인용되면 인용된 부분이 문자 그대로 일치됩니다. 이는 인용된 부분의 모든 문자가 특별한 패턴 일치 의미 없이 자체적으로 일치함을 의미합니다.
답변2
숫자의 의미에 따라 다릅니다. 0x12
, inf
, 1.2
, -12
, ¹²³
, ⑱
, 1e6
, 1,000,000
, , Ⅷ
, 0x123p-5
는 6,23
모두 0b100110
특정 정의에 따른 숫자 입니다.숫자, 및 는 일부 다른 숫자에는 유효하지 않은 숫자 08
입니다 .019
9999999999999999999999999999999999
문자열이 하나 이상의 ASCII 십진수로 구성되어 있는지 테스트하려면 다음을 사용할 수 있습니다.
기준:
valid() {
case $1 in
("" | *[!0123456789]*) false;;
(*) true;;
esac
}
또는 ksh, bash( bash -O extglob
이전 버전 사용) 또는 zsh -o kshglob
:
valid() [[ $1 = +([0123456789]) ]]
또는 bash/ksh93/zsh/yash에서:
valid() [[ $1 =~ ^[0123456789]+$ ]]
valid() [[ $1 =~ '^[0123456789]+$' ]]
zsh1 및 bash 3.1 또는 에서도 작동합니다 . zsh1 및 bash 3.1 또는 bash -O compat31
. , 예를 들어 . 그때도 사용할 수 있습니다 .zsh
rematchpcre
[[ $1 =~ '^[0123456789]\z' ]]
$
$'123\n'
[[ $1 =~ '^\d+\z' ]]
존재하다 zsh
:
valid() [[ $1 = <-> ]]
그럼에도 불구하고 [[:digit:]]
일부 시스템에서는 ASCII 아라비아 숫자 이외의 십진수 일치를 피하십시오. zsh, 특히 bash를 제외하고는 [0-9]
입력 유효성 검사에 사용하지 마십시오. 일반적으로 0에서 9 사이로 정렬되는 임의의 문자와 일치하기 때문입니다.
1 그러나 zsh에서는 변수 값에 NUL 바이트가 포함될 수 있으며 표준 정규식 API(PCRE와 반대)는 NUL을 포함하는 일치하는 문자열을 지원하지 않습니다. 이 rematchpcre
옵션이 활성화되지 않으면 예를 들어 다음과 [[ $1 =~ '^[0123456789]+$' ]]
일치합니다 .$'123\0xyz'