Kiểm tra nếu một số đầu vào là một số nguyên


31

Tôi đang cố kiểm tra xem đầu vào có phải là số nguyên hay không và tôi đã kiểm tra hàng trăm lần nhưng không thấy lỗi trong trường hợp này. Than ôi, nó không hoạt động, nó kích hoạt câu lệnh if cho tất cả các đầu vào (số / chữ cái)

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

Tôi đã chơi xung quanh với các trích dẫn nhưng hoặc bỏ lỡ nó hoặc nó không làm gì cả. Tôi làm gì sai? Có cách nào dễ dàng hơn để kiểm tra nếu đầu vào chỉ là INTEGER không?

Câu trả lời:


25

Xóa dấu ngoặc kép

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


Vì vậy, có một lỗi. Với dấu ngoặc kép, biểu thức chính quy được coi là một chuỗi ký tự. Người ta có thể kiểm tra xem vớiscale='^[0-9]+$'; [[ "$scale" == "^[0-9]+$" ]] && echo equal || echo "not equal"
jimmij

15

Sử dụng -eqtoán tử của lệnh kiểm tra :

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

Nó không chỉ hoạt động trong bashmà còn bất kỳ vỏ POSIX. Từ tài liệu kiểm tra POSIX :

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

kiểm tra xem có bất kỳ số nào không, không chỉ là số nguyên
lonewar Warrior556

2
@ lonewar Warrior556: Nó chỉ hoạt động cho số nguyên, xem: pubs.opengroup.org/onlinepub/9699919799/utilities/test.html . Tôi đoán bạn đã nói với bất kỳ số nào vì bạn sử dụng thử nghiệm mới [[thay vì thử nghiệm cũ [như của tôi.
cuonglm

Ý kiến ​​hay nhưng hơi ồn ào. Tôi thà không phải chuyển hướng lỗi sang dev null.
tự đại diện

2
@Wildcard: Đúng, chúng tôi trả tiền cho tính di động.
cuonglm

8

Đối với số nguyên không dấu tôi sử dụng:

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

Các xét nghiệm:

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

Sorry integers only

1
Tôi thích cái đó vì nó được tạo ra với các bản dựng, nhanh và có vẻ khá ổn ... Tôi đã thử trên một lớp vỏ cũ (bash 2.0.5) và nó hoạt động hoàn hảo.
Olivier Dulac

Còn không gian bên trong đối số thì sao? Giống như 086 .
0andriy

@ 0andriy Xem thử nghiệm thứ hai.
raciasolvo

8

Vì OP dường như chỉ muốn các số nguyên dương:

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

Ví dụ:

$ 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

Lưu ý rằng một [bài kiểm tra là bắt buộc:

$ [[ "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

Điều này là do hội nghị diễn ra với [[:

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

đây là câu trả lời thực sự ... những người khác đã thất bại
Scott Stensland

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

Đó là kiểm tra và đầu ra lỗi của bạn.


OPTINDở đây cũng tốt chỉ saiyan.
mikeerv

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.