답변:
다음은 양수 또는 음수의 정수를 감지 dash
하고 POSIX에서 작동 하며 POSIX입니다.
echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"
case "${1#[+-]}" in
''|*[!0-9]*)
echo "Not an integer" ;;
*)
echo "Integer" ;;
esac
또는 :
(nop) 명령을 약간 사용하여 :
! case ${1#[+-]} in *[!0-9]*) :;; ?*) ! :;; esac && echo Integer
여부 dash
, bash
, ksh
, zsh
, POSIX sh
, 또는 posh
( "Bourne 쉘의 재 구현" sh
); case
구조는 가장 널리 사용하고 신뢰할 수 :
case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac
dash
? 그것은 나를 위해 작동 bash
하지만 아닙니다 dash
.
dash
. echo $?
case 명령 뒤에 추가 한 결과를 조사합니다 .
posh
( "Bourne 쉘의 재 구현")도이 솔루션에 아무런 문제가 없습니다.
case
. 한 가지 이유는 설명하는 버그이며, 또 다른 이유는 일치하는 괄호 (vim)에 의존하는 기능이있는 편집기에서 훨씬 더 나은 지원을 제공하는 것입니다. -WRT posh
는 POSIX입니다. 글쎄, 내가 준 매뉴얼 페이지의 인용문은 다른 것을 제안했지만 어쨌든 그러한 비공식적 진술에 의존 할 수는 없다고 생각합니다. 우리가 POSIX 시대에 있기 때문에 오래된 본 쉘은 더 이상 그렇게 중요하지 않습니다.
-eq
문자열 자체 에서 테스트를 사용할 수 있습니다 .
$ dash -c 'a="a"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: a
not a number
$ dash -c 'a="0xa"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: 0xa
not a number
$ dash -c 'a="-1"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
number
오류 메시지가 문제인 경우 오류 출력을 /dev/null
다음으로 리디렉션하십시오 .
$ dash -c 'a="0xa"; [ "$a" -eq "$a" ] 2>/dev/null|| echo no'
no
" 023 "
숫자 라고 말합니다 . 피연산자가 노트 십진 정수인 경우 동작이 지정되지 않으므로 대시와 함께 작동하지만 다른 모든 POSIX 쉘은 아닙니다. 예를 들어 ksh를 사용하면 SHLVL
또는 라고 말합니다 1+1
.
산술 확장으로 사용 해보고 작동하는지 확인하십시오. 실제로 산술 확장은 앞뒤 공백을 무시하기 때문에 그보다 조금 더 엄격해야합니다. 산술 확장도 수행하고 확장 된 결과가 원래 변수와 정확히 일치하는지 확인하십시오.
check_if_number()
{
if [ "$1" = "$((${1}))" ] 2>/dev/null; then
echo "Number!"
else
echo "not a number"
fi
}
음수를 사용할 수도 있습니다. 실제로 제외하려는 경우 추가 검사를 추가하십시오 $((${1} >= 0))
.
[[
$(( ... ))
? 그렇다면 내 대답은 여전히 정확해야합니다. 견적을 추가하면됩니다.
check_if_number 1.2
그리고 함수는 반환 : dash: 3: arithmetic expression: expecting EOF: "1.2"
아마도 expr
?
if expr match "$1" '^\([0-9]\+\)$' > /dev/null; then
echo "integer"
else
echo "non-integer"
fi
match
아닙니다 \+
. 또한 0은 숫자가 아니라고 말합니다. 당신은expr "x$1" : 'x[0-9]\{1,\}$'
POSIX 시스템에서는 expr 을 사용할 수 있습니다 :
$ a=a
$ expr "$a" - 0 >/dev/null 2>&1
$ [ "$?" -lt 2 ] && echo Integer || echo Not Integer
expr
구현에서는 9999999999999999999가 정수가 아니라고 말합니다. POSIX는 이것이 작동한다고 보증하지 않습니다. 실제로 GNU 시스템에서는 "길이"가 정수라고 말합니다.
expr 9999999999999999999 + 0
나에게 3 종료 상태를 제공하고 expr -12 + 0
그리고 expr length + 0
나에게 GNU의 EXPR와 0 종료 상태 줄 ( + string
힘 string
GNU와 문자열로 간주하기를 expr
. expr "$a" - 0
잘 작동 것입니다).
-12
유효한 정수 라고 생각 9999999999999999999
하고 오버플로를주었습니다.
다음은 muru 의 답변 과 동일한 방법을 사용하는 간단한 함수입니다 .
IsInteger() # usage: IsInteger string
{ # returns: flag
[ "$1" -eq "$1" ] 2> /dev/null
}
예:
p= n=2a3; IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"
p= n=23; IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"
산출:
'2a3' isn't an integer
'23' is an integer
foo\n123\nbar
정수는 아니지만이 테스트를 통과합니다.