ตรวจสอบว่าหมายเลขอินพุตเป็นจำนวนเต็มหรือไม่


31

ฉันพยายามตรวจสอบว่าการป้อนข้อมูลเป็นจำนวนเต็มหรือไม่และฉันผ่านไปหลายร้อยครั้ง แต่ไม่เห็นข้อผิดพลาดในสิ่งนี้ อนิจจามันไม่ทำงานมันเป็นต้นเหตุของคำสั่ง if สำหรับอินพุตทั้งหมด (ตัวเลข / ตัวอักษร)

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

ฉันเล่นด้วยคำพูด แต่ก็ไม่ได้ทำหรือไม่ทำอะไรเลย ฉันทำอะไรผิด มีวิธีที่ง่ายกว่าในการทดสอบว่าอินพุตเป็นเพียงจำนวนเต็มหรือไม่?

คำตอบ:


25

ลบเครื่องหมายคำพูด

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

stackoverflow.com/questions/806906/…มีการเสนอราคาย้อนหลัง
lonewarrior556

ดังนั้นจึงมีข้อผิดพลาด ด้วยเครื่องหมายคำพูด regexp จะถือเป็นสตริงตัวอักษร สามารถตรวจสอบได้ด้วย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

มันไม่เพียงทำงานในbashแต่ยังเปลือก POSIX ใด ๆ จากเอกสารทดสอบ 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
Wildcard

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
ฉันชอบอันนั้นเพราะมันทำจากบิวด์อินเร็วและดูเหมือนว่าจะเป็น ... ฉันลองใช้กระสุนเก่า (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.