यह जांचना कि इनपुट नंबर पूर्णांक है या नहीं


31

मैं यह जांचने की कोशिश कर रहा हूं कि क्या इनपुट एक पूर्णांक है और मैं इसे सौ बार पार कर चुका हूं, लेकिन इसमें त्रुटि नहीं देखी गई है। काश, यह काम नहीं करता है, यह सभी इनपुट (संख्या / अक्षर) के लिए स्टेटमेंट को ट्रिगर करता है

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

मैंने उद्धरणों के साथ खेला है, लेकिन या तो वह चूक गया या उसने कुछ नहीं किया। मुझसे क्या गलती हुई है? अगर एक इनपुट सिर्फ एक INTEGER है तो परीक्षण करने का एक आसान तरीका है?

जवाबों:


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"
जिमीज

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 । मुझे लगता है कि आपने किसी भी संख्या के लिए कहा क्योंकि आप [[पुराने परीक्षण के बजाय नए परीक्षण का उपयोग करते हैं [
कोउन्ग्लम

अच्छा विचार है लेकिन थोड़ा शोर है। मैं नहीं बल्कि अशक्त त्रुटियों को रीडायरेक्ट करना होगा।
वाइल्डकार्ड

2
@Wildcard: हां, हम इसे पोर्टेबिलिटी के लिए भुगतान करते हैं।
congonglm

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) पर कोशिश की और यह पूरी तरह से काम करता है।
ओलिवियर दुलक

तर्क के अंदर रिक्त स्थान के बारे में क्या? जैसे "086"

@ 0 परीक्षण दूसरा परीक्षण देखें।
रेसियासोल्वो

8

जैसा कि ओपी केवल सकारात्मक पूर्णांक चाहता है:

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

यह वास्तविक उत्तर है ... अन्य विफल रहे
स्कॉट स्टेंसलैंड

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

यह चेक करता है और आपकी त्रुटि को आउटपुट करता है।


OPTINDयहाँ भी अच्छा है। बस सयान।
mikeserv

2

कृपया जांच लें कि यदि कोई संस्करण बैश स्टैकओवरफ़्लो पेज में एक संख्या है तो मैं कैसे परीक्षण कर सकता हूं । इस पृष्ठ में पूर्णांक संख्या की जाँच के लिए कुछ अन्य अच्छे तरीके हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.