입력 숫자가 정수인지 확인


31

입력이 정수인지 확인하려고하는데 100 번 이상 입력했지만 오류가 표시되지 않습니다. 아아, 그것은 작동하지 않습니다, 그것은 모든 입력 (숫자 / 문자)에 대해 if 문을 트리거합니다

read scale
if ! [[ "$scale" =~ "^[0-9]+$" ]]
        then
            echo "Sorry integers only"
fi

나는 따옴표로 놀았지만 놓쳤거나 아무것도하지 않았다. 내가 뭘 잘못 했니? 입력이 단지 INTEGER인지 테스트하는 더 쉬운 방법이 있습니까?

답변:


25

따옴표 제거

if ! [[ "$scale" =~ ^[0-9]+$ ]]
    then
        echo "Sorry integers only"
fi


그래서 버그가 있습니다. 따옴표로 정규 표현식은 리터럴 문자열로 처리됩니다. 하나는 그와 함께 확인하실 수 있습니다scale='^[0-9]+$'; [[ "$scale" == "^[0-9]+$" ]] && echo equal || echo "not equal"
jimmij

15

테스트 명령의 -eq연산자를 사용하십시오 .

read scale
if ! [ "$scale" -eq "$scale" ] 2> /dev/null
then
    echo "Sorry integers only"
fi

bashPOSIX 셸뿐만 아니라 작동합니다 . POSIX 테스트 문서에서 :

n1 -eq  n2
    True if the integers n1 and n2 are algebraically equal; otherwise, false.

정수뿐만 아니라 모든 숫자가 있는지 확인합니다
lonewarrior556

2
@ lonewarrior556 : 정수에 대해서만 작동합니다 ( pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html 참조) . [[오래된 테스트 대신 새로운 테스트를 사용하기 때문에 어떤 숫자로든 말한 [것 같습니다.
cuonglm

좋은 생각이지만 약간 시끄 럽습니다. 차라리 오류를 dev null로 리디렉션하지 않아도됩니다.
와일드 카드

2
@Wildcard : 그렇습니다. 이식성에 대해 지불합니다.
cuonglm

8

부호없는 정수의 경우 다음을 사용합니다.

read -r scale
[ -z "${scale//[0-9]}" ] && [ -n "$scale" ] || echo "Sorry integers only"

테스트 :

$ ./test.sh
7
$ ./test.sh
   777
$ ./test.sh
a
Sorry integers only
$ ./test.sh
""
Sorry integers only
$ ./test.sh

Sorry integers only

1
나는 내장으로 만들어졌고 빠르며 꽤 posix 인 것처럼 그 것을 좋아합니다 ... 나는 오래된 껍질 (bash 2.0.5)에서 시도했으며 완벽하게 작동합니다.
Olivier Dulac

인수 내부의 공백은 어떻습니까? "086" 처럼 .
0andriy

@ 0andriy 두 번째 테스트를보십시오.
raciasolvo

8

OP는 양의 정수 만 원하는 것처럼 보입니다.

[ "$1" -ge 0 ] 2>/dev/null

예 :

$ is_positive_int(){ [ "$1" -ge 0 ] 2>/dev/null && echo YES || echo no; }
$ is_positive_int word
no
$ is_positive_int 2.1
no
$ is_positive_int -3
no
$ is_positive_int 42
YES

단일 [테스트가 필요합니다.

$ [[ "word" -eq 0 ]] && echo word equals zero || echo nope
word equals zero
$ [ "word" -eq 0 ] && echo word equals zero || echo nope
-bash: [: word: integer expression expected
nope

다음과 [[같이 역 참조가 발생하기 때문입니다 .

$ word=other
$ other=3                                                                                                                                                                                  
$ [[ $word -eq 3 ]] && echo word equals other equals 3
word equals other equals 3

이것은 실제 답변입니다 ... 다른 사람들은 실패했습니다
Scott Stensland

3
( scale=${scale##*[!0-9]*}
: ${scale:?input must be an integer}
) || exit

확인하고 오류를 출력합니다.


OPTIND여기도 좋습니다. 그냥 사이 얀.
mikeserv

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.