@charles Dufy와 다른 사람들이 이미 명확한 대답을했습니다. 순수한 bash 솔루션은 다음을 사용합니다.
string="-12,345"
if [[ "$string" =~ ^-?[0-9]+[.,]?[0-9]*$ ]]
then
echo $string is a number
else
echo $string is not a number
fi
실수의 경우 기수 앞에 숫자가 있어야하는 것은 아닙니다 .
부동 수와 과학적 표기법 (C / Fortran의 많은 프로그램 또는이 방법으로 부동 수출)을보다 철저하게 지원하기 위해이 라인에 유용한 추가 사항은 다음과 같습니다.
string="1.2345E-67"
if [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*[eE]?-?[0-9]+$ ]]
then
echo $string is a number
else
echo $string is not a number
fi
따라서 특정 유형을 찾고 있다면 숫자 유형을 구별하는 방법으로 이어집니다.
string="-12,345"
if [[ "$string" =~ ^-?[0-9]+$ ]]
then
echo $string is an integer
elif [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*$ ]]
then
echo $string is a float
elif [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*[eE]-?[0-9]+$ ]]
then
echo $string is a scientific number
else
echo $string is not a number
fi
참고 : 십진수 및 과학적 표기법에 대한 구문 요구 사항을 나열 할 수 있습니다. 하나는 쉼표를 기수로, "."로 허용하는 것입니다. 그런 다음 기수 지점이 하나만 있어야한다고 주장합니다. [Ee] 플로트에는 두 개의 +/- 기호가있을 수 있습니다. 나는 Aulu의 연구에서 몇 가지 규칙을 더 배우고 '' '-' '-E-1' '0-0'과 같은 잘못된 문자열에 대해 테스트했습니다. 다음은 내 정규식 / 하위 문자열 / 전문가 도구입니다.
parse_num() {
local r=`expr "$1" : '.*\([.,]\)' 2>/dev/null | tr -d '\n'`
nat='^[+-]?[0-9]+[.,]?$' \
dot="${1%[.,]*}${r}${1##*[.,]}" \
float='^[\+\-]?([.,0-9]+[Ee]?[-+]?|)[0-9]+$'
[[ "$1" == $dot ]] && [[ "$1" =~ $float ]] || [[ "$1" =~ $nat ]]
} # usage: parse_num -123.456
test && echo "foo" && exit 0 || echo "bar" && exit 1
사용중인 접근 방식에 의도하지 않은 부작용이있을 수 있습니다-에코가 실패하면 (아마도 출력이 닫힌 FD에 출력됩니다)exit 0
건너 뛰고 코드는 시도합니다echo "bar"
. 그것도 실패하면&&
조건이 실패하고 심지어 실행되지 않습니다exit 1
! /if
대신 실제 명령문을 사용하면 예기치 않은 부작용이 적습니다.&&
||