परीक्षण करें कि क्या स्ट्रिंग एक वैध पूर्णांक है


117

मैं कुछ सामान्य करने की कोशिश कर रहा हूं: शेल स्क्रिप्ट में उपयोगकर्ता इनपुट। यदि उपयोगकर्ता ने एक वैध पूर्णांक प्रदान किया है, तो स्क्रिप्ट एक काम करता है, और यदि मान्य नहीं है, तो यह कुछ और करता है। मुसीबत यह है, मुझे ऐसा करने का एक आसान (और उचित रूप से सुरुचिपूर्ण) तरीका नहीं मिला है - मैं नहीं चाहता कि मैं इसे चार-चार करके अलग करूं।

मुझे पता है कि यह आसान होना चाहिए लेकिन मुझे नहीं पता कि कैसे। मैं इसे एक दर्जन भाषाओं में कर सकता था, लेकिन BASH नहीं!

अपने शोध में मैंने यह पाया:

यह जांचने के लिए नियमित अभिव्यक्ति है कि क्या एक स्ट्रिंग में आधार 10 में एक वैध वास्तविक संख्या है

और इसमें एक उत्तर है कि रेगेक्स के बारे में बात करता है, लेकिन अभी तक मुझे पता है, कि सी (दूसरों के बीच) में उपलब्ध एक फ़ंक्शन है। फिर भी, यह एक महान जवाब की तरह लग रहा था तो मैंने इसे grep के साथ आज़माया, लेकिन grep को यह नहीं पता था कि इसके साथ क्या करना है। मैंने कोशिश की- जो मेरे बॉक्स पर है, इसका मतलब है कि इसे एक perL regexp - nada के रूप में माना जाए। डैश E (-E) ने भी काम नहीं किया। और न ही-एफ।

बस स्पष्ट होने के लिए, मैं कुछ इस तरह की कोशिश कर रहा हूं, किसी भी आउटपुट की तलाश कर रहा हूं - वहां से, मुझे जो भी मिलेगा उसका लाभ उठाने के लिए स्क्रिप्ट को हैक करूंगा। (आईओडब्ल्यू, मैं उम्मीद कर रहा था कि एक गैर-अनुरूप इनपुट कुछ भी नहीं देता है जबकि एक वैध रेखा दोहराई जाती है।)

snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
   echo "Not an integer - nothing back from the grep"
else
   echo "Integer."
fi

क्या कोई यह वर्णन करेगा कि यह सबसे आसानी से कैसे किया जाता है?

सच कहूँ तो, यह मेरी राय में, टेस्ट का एक छोटा-सा दौरा है। इस तरह का झंडा होना चाहिए

if [ -I "string" ] ;
then
   echo "String is a valid integer."
else
   echo "String is not a valid integer."
fi

4
FYI करें: [पुराना संगत है test; [[बैश की नई चीज है, जिसमें अधिक परिचालन और अलग-अलग उद्धरण नियम हैं। यदि आप पहले से ही बैश के साथ रहने का फैसला कर चुके हैं, तो इसके लिए जाएं [[(यह वास्तव में बहुत अच्छा है); यदि आपको अन्य गोले के लिए पोर्टेबिलिटी की आवश्यकता है, तो [[पूरी तरह से बचें ।
21

जवाबों:


183
[[ $var =~ ^-?[0-9]+$ ]]
  • ^इंगित करता है इनपुट पद्धति की शुरुआत
  • -एक शाब्दिक है "-"
  • ?पूर्ववर्ती के (0 या 1 -) का अर्थ है "
  • इसका +मतलब है "1 या पूर्ववर्ती ( [0-9])"
  • $इनपुट पद्धति के अंत इंगित करता है

तो रेगेक्स -एक या अधिक दशमलव अंकों के बाद एक वैकल्पिक (ऋणात्मक संख्याओं के मामले के लिए) से मेल खाता है ।

संदर्भ :


3
धन्यवाद इग्नासियो, मैं इसे एक दूसरे में कोशिश करूँगा। क्या आप इसे समझा सकते हैं ताकि मैं थोड़ा सीख सकूं? मैं इसे पढ़ता हूं, "स्ट्रिंग की शुरुआत में (^), एक शून्य चिह्न (-) वैकल्पिक है (?), इसके बाद शून्य और 9 के बीच किसी भी संख्या में वर्ण शामिल हैं," ... और फिर क्या हो सकता है + $ का मतलब? धन्यवाद।
रिचर्ड टी

10
+"पूर्ववर्ती के 1 या अधिक" का अर्थ है, और $इनपुट पैटर्न के अंत को इंगित करता है। तो regex -एक या एक से अधिक दशमलव अंकों के बाद एक वैकल्पिक से मेल खाता है ।
इग्नासियो वाज़केज़-अब्राम्स

बड़बड़ा फिर से: एबीएस लिंक
चार्ल्स डफी

यह एक स्पर्शज्या है, लेकिन ध्यान दें कि जब वर्णों को निर्दिष्ट करने से आप विषम परिणाम प्राप्त कर सकते हैं; उदाहरण के लिए, [A-z]केवल आप नहीं देंगे A-Zऔर a-zलेकिन यह भी \ , [, ], ^, _, और `
डॉकटोर जे।

इसके अतिरिक्त, वर्ण-विभाजन के आधार पर ( इस संबंधित प्रश्न / उत्तर को देखें ) कुछ ऐसा d[g-i]{2}हो सकता है कि न केवल मिलान समाप्त हो सकता है, digबल्कि dishउस उत्तर द्वारा सुझाए गए समतलीकरण में भी हो सकता है (जहां shडिग्राफ को एक एकल वर्ण माना जाता है, उसके बाद टकराया गया h)।
डॉकटोर जे।

61

वाह ... यहाँ बहुत सारे अच्छे समाधान हैं !! उपरोक्त सभी समाधानों में, मैं @ निश्चय से सहमत हूं कि -eqएक लाइनर का उपयोग करना सबसे अच्छा है।

मैं GNU बैश, संस्करण 4.1.5(डेबियन) चला रहा हूं । मैंने इसे ksh (SunSO 5.10) पर भी चेक किया है।

यहाँ $1पूर्णांक है या नहीं, यह जाँचने का मेरा संस्करण है :

if [ "$1" -eq "$1" ] 2>/dev/null
then
    echo "$1 is an integer !!"
else
    echo "ERROR: first parameter must be an integer."
    echo $USAGE
    exit 1
fi

यह दृष्टिकोण नकारात्मक संख्याओं के लिए भी है, जिसमें से कुछ अन्य समाधानों में एक दोषपूर्ण नकारात्मक परिणाम होगा, और यह "+" (जैसे +30) के एक उपसर्ग की अनुमति देगा जो स्पष्ट रूप से पूर्णांक है।

परिणाम:

$ int_check.sh 123
123 is an integer !!

$ int_check.sh 123+
ERROR: first parameter must be an integer.

$ int_check.sh -123
-123 is an integer !!

$ int_check.sh +30
+30 is an integer !!

$ int_check.sh -123c
ERROR: first parameter must be an integer.

$ int_check.sh 123c
ERROR: first parameter must be an integer.

$ int_check.sh c123
ERROR: first parameter must be an integer.

इग्नासियो वाज़क्वेज़-अब्राम्स द्वारा प्रदान किया गया समाधान भी बहुत ही साफ-सुथरा था (यदि आप रेगेक्स को पसंद करते हैं) यह समझाया गया था। हालाँकि, यह +उपसर्ग के साथ सकारात्मक संख्याओं को संभालता नहीं है , लेकिन इसे आसानी से नीचे दिया जा सकता है:

[[ $var =~ ^[-+]?[0-9]+$ ]]

अच्छा! हालांकि यह बहुत सुंदर है ।
देवनुल

हाँ। यह इसी तरह की है। हालाँकि, मैं "if" स्टेटमेंट के लिए एक लाइनर समाधान ढूंढ रहा था। मैंने सोचा कि मुझे वास्तव में इसके लिए एक फ़ंक्शन को कॉल करने की आवश्यकता नहीं है। इसके अलावा, मैं देख सकता हूं कि फ़ंक्शन में stdout को stderr का पुनर्निर्देशन। जब मैंने कोशिश की, तो stderr संदेश "पूर्णांक अभिव्यक्ति अपेक्षित" प्रदर्शित किया गया था जो मेरे लिए वांछनीय नहीं था।
पीटर हो

धन्यवाद! मैं इसे आसान और सुरुचिपूर्ण कहूंगा।
एजरा नुग्रोहो

2
आपके समाधान और रेगेक्स एक के बीच एक उल्लेखनीय अंतर है: पूर्णांक का आकार बैश सीमाओं की ओर जांचा जाता है (मेरे कंप्यूटर पर यह 64 बिट है)। यह सीमा regexp समाधान से नहीं टकराती है। तो आप समाधान 64 बिट कंप्यूटरों पर 9223372036854775807 से अधिक संख्या में सख्ती से विफल हो जाएगा।
vabab

2
जैसा कि मैंने हाल ही में खोजा है, कुछ कैविटीज़ हैं
काइल स्ट्रैंड

28

यहां पार्टी के लिए देर से आने वाले। मैं बेहद हैरान हूं कि कोई भी जवाब सबसे सरल, सबसे तेज, सबसे पोर्टेबल समाधान का उल्लेख नहीं करता है; caseबयान।

case ${variable#[-+]} in
  *[!0-9]* | '') echo Not a number ;;
  * ) echo Valid number ;;
esac

तुलना से पहले किसी भी संकेत की ट्रिमिंग किसी हैक की तरह महसूस होती है, लेकिन यह केस स्टेटमेंट के लिए अभिव्यक्ति को इतना सरल बना देता है।


4
मेरी इच्छा है कि मैं हर बार एक बार इस सवाल को उठाऊं क्योंकि मैं इस सवाल पर वापस आता हूं। यह मेरे गियर्स को पीसता है कि एक सरल अभी तक POSIX- अनुरूप समाधान नीचे में दफन है।
एड्रियन फ्रुविर्थ

3
हो सकता है कि आपको खाली तारों का ध्यान रखना चाहिए:''|*[!0-9]*)
निकल्स पीटर

2
BTW: यहाँ यह सिंटैक्स प्रलेखित है: tldp.org/LDP/abs/html/string-manipulation.html
Niklas Peter

मैं विशेष रूप से ABS को कंडेन नहीं करता हूं; यह स्पष्ट रूप से बैश मैनुअल में भी प्रलेखित है। वैसे भी, आप जिस अनुभाग से जुड़े हैं वह इस विशेष निर्माण का वर्णन नहीं करता है, बल्कि @ @ उत्तर के रूप में।
ट्रिपल डे

@tripleee लिंक किए गए दस्तावेज़ में केस लाइन में उपयोग किए गए एक चर से एक उपसर्ग को हटाने के लिए निर्माण का वर्णन है। यह पृष्ठ के निचले भाग में है, लेकिन कोई लंगर नहीं हैं, इसलिए मैं सीधे इसे लिंक नहीं कर सका, अनुभाग "सब्स्ट्रीम रिमूवल" देखें
निकल्स पीटर

10

मुझे -eqपरीक्षण का उपयोग कर समाधान पसंद है , क्योंकि यह मूल रूप से एक-लाइनर है।

मेरा खुद का समाधान सभी अंकों को दूर फेंकने के लिए पैरामीटर विस्तार का उपयोग करना था और यह देखना था कि क्या कुछ बचा था। (मैं अभी भी 3.0 का उपयोग कर रहा हूँ, इस्तेमाल नहीं किया है [[या exprपहले, लेकिन उनसे मिलकर खुशी हुई।)

if [ "${INPUT_STRING//[0-9]}" = "" ]; then
  # yes, natural number
else
  # no, has non-numeral chars
fi

4
इसका उपयोग करके और सुधार किया जा सकता है [ -z "${INPUT_STRING//[0-9]}" ]लेकिन वास्तव में अच्छा समाधान है!
शेलफिश

नकारात्मक संकेतों के बारे में क्या?
स्कॉटीसियस

-eqसमाधान कुछ मुद्दे हैं; यहाँ देखें: stackoverflow.com/a/808740/1858225
काइल स्ट्रैंड

खाली INPUT_STRING को संख्या के रूप में माना जाता है, इसलिए मेरे मामले में विफल रहता है
Manwe

9

प्री-बैश 3.1 (जब =~परीक्षण पेश किया गया था) के लिए पोर्टेबिलिटी के लिए , का उपयोग करें expr

if expr "$string" : '-\?[0-9]\+$' >/dev/null
then
  echo "String is a valid integer."
else
  echo "String is not a valid integer."
fi

expr STRING : REGEXSTREX की शुरुआत में पहले से पहचाने गए REGEX की खोज, पहले समूह (या मैच की लंबाई, यदि कोई नहीं) की प्रतिध्वनि और सफलता या असफलता लौटाती है। यह पुराने रेगेक्स सिंटेक्स है, इसलिए अतिरिक्त है \-\?"शायद -" का [0-9]\+अर्थ है , "एक या अधिक अंक", और $"स्ट्रिंग का अंत" का अर्थ है।

बैश भी विस्तारित ग्लब्स का समर्थन करता है, हालांकि मुझे याद नहीं है कि किस संस्करण से आगे।

shopt -s extglob
case "$string" of
    @(-|)[0-9]*([0-9]))
        echo "String is a valid integer." ;;
    *)
        echo "String is not a valid integer." ;;
esac

# equivalently, [[ $string = @(-|)[0-9]*([0-9])) ]]

@(-|)" -या कुछ भी नहीं" का [0-9]अर्थ है , "अंक", और *([0-9])"शून्य या अधिक अंक" का अर्थ है।


शुक्रिया, आप बहुत धन्यवाद। मैंने पहले कभी नहीं देखा था ~ ~ वाक्यविन्यास - और अभी भी पता नहीं है कि इसका क्या मतलब है - लगभग बराबर?! ... मैं बीएचएएस में कार्यक्रम करने के लिए उत्साहित नहीं हूं, लेकिन यह कुछ समय के लिए आवश्यक है!
रिचर्ड टी

में awk, ~"रेगेक्स मैच" ऑपरेटर था। पर्ल में (जैसा कि सी से कॉपी ~किया गया था ), पहले से ही "बिट पूरक" के लिए उपयोग किया गया था, इसलिए उन्होंने उपयोग किया =~। बाद में इस नोटेशन को कई अन्य भाषाओं में कॉपी किया गया। (पर्ल 5.10 और पर्ल 6 को ~~अधिक पसंद करते हैं, लेकिन इसका यहां कोई प्रभाव नहीं है।) मुझे लगता है कि आप इसे कुछ हद तक अनुमानित समानता के रूप में देख सकते हैं ...
21

बहुत बढ़िया पोस्ट और संपादन! मैं वास्तव में यह समझाने की सराहना करता हूं कि इसका क्या मतलब है। काश मैं तुम्हारा और इग्नासियुस के पदों को सही उत्तर के रूप में चिह्नित कर सकता। -फिरना- तुम लोग दोनों महान हो। लेकिन जैसा कि आप उसकी प्रतिष्ठा को दोगुना करते हैं, मैं इसे इग्नासियो को दे रहा हूं - आशा है कि आप समझ गए होंगे! -smile-
रिचर्ड टी

4

यहाँ अभी तक एक और इसे ले रहा है (केवल परीक्षण बिलिन कमांड और इसके रिटर्न कोड का उपयोग करके):

function is_int() { return $(test "$@" -eq "$@" > /dev/null 2>&1); } 

input="-123"

if $(is_int "${input}");
then
   echo "Input: ${input}"
   echo "Integer: $[${input}]"
else
   echo "Not an integer: ${input}"
fi

1
इसके $()साथ उपयोग करना आवश्यक नहीं है if। यह काम करता है if is_int "$input":। इसके अलावा, $[]फॉर्म को पदावनत कर दिया गया है। $(())इसके बजाय उपयोग करें । या तो अंदर, डॉलर चिह्न को छोड़ा जा सकता है: echo "Integer: $((input))"आपकी स्क्रिप्ट में कहीं भी घुंघराले ब्रेस आवश्यक नहीं हैं।
अगली सूचना तक रोक दिया गया।

मुझे उम्मीद है कि यह भी बैश के आधार संकेतन में संख्याओं को मान्य पूर्णांकों के रूप में संभालेगा (जो निश्चित रूप से कुछ परिभाषा के अनुसार हैं; लेकिन यह आपके साथ सहमत नहीं हो सकता है) लेकिन testइसका समर्थन करने के लिए प्रकट नहीं होता है। [[हालांकि, करता है। [[ 16#aa -eq 16#aa ]] && echo integerप्रिंट "पूर्णांक"।
ट्रिपल

ध्यान दें कि [[इस विधि के लिए झूठी सकारात्मक रिटर्न; उदा [[ f -eq f ]]सफल। तो यह उपयोग करना चाहिए testया [
पालक

3

आप गैर-अंकों को छीन सकते हैं और तुलना कर सकते हैं। यहाँ एक डेमो स्क्रिप्ट है:

for num in "44" "-44" "44-" "4-4" "a4" "4a" ".4" "4.4" "-4.4" "09"
do
    match=${num//[^[:digit:]]}    # strip non-digits
    match=${match#0*}             # strip leading zeros
    echo -en "$num\t$match\t"
    case $num in
        $match|-$match)    echo "Integer";;
                     *)    echo "Not integer";;
    esac
done

परीक्षण आउटपुट ऐसा दिखता है:

44 44 पूर्णांक
-44 44 इंटेगर
44- 44 पूर्णांक नहीं
4-4 44 पूर्णांक नहीं
a4 4 पूर्णांक नहीं
4 ए 4 पूर्णांक नहीं
.4 4 पूर्णांक नहीं
4.4 44 पूर्णांक नहीं
-4.4 44 पूर्णांक नहीं
09 9 पूर्णांक नहीं

हाय डेनिस, मैच के दाईं ओर = ऊपर वाक्य रचना में मुझे पेश करने के लिए धन्यवाद। मैंने पहले कभी उस वाक्य रचना को नहीं देखा है। मैं त्रि से कुछ वाक्यविन्यास पहचानता हूं (एक उपयोगिता जिसे मैंने बहुत महारत हासिल नहीं की है, लेकिन कभी-कभी मेरे रास्ते को खराब कर देता है); ऐसे सिंटैक्स पर मैं कहां तक ​​पढ़ सकता हूं? (यानी, इस प्रकार की चीज़ को क्या कहा जाता है?) धन्यवाद।
रिचर्ड टी

आप "पैरामीटर विस्तार" नामक अनुभाग में बैश मैन पेज के बारे में जानकारी के लिए देख सकते हैं ${var//string}और ${var#string}अनुभाग में "^ [[अंक:]]] के लिए" पैटर्न मिलान "कहा जाता है (जो इसमें भी कवर किया गया है man 7 regex)।
अगली सूचना तक रोक दिया गया।

1
match=${match#0*}अग्रणी शून्य को पट्टी नहीं करता है , यह अधिकतम एक शून्य पर स्ट्रिप्स करता है। विस्तार का उपयोग करके यह केवल के extglobमाध्यम से प्राप्त किया जा सकता है match=${match##+(0)}
एड्रियन फ्रुविर्थ

9 या 09 एक पूर्णांक नहीं है?
माइक क्यू

09अगर आप एक पूर्णांक को अग्रणी शून्य नहीं मानते हैं तो @MikeQ: पूर्णांक नहीं है। परीक्षण है कि क्या इनपुट ( 09) एक सैनिटाइज्ड संस्करण ( 9- एक पूर्णांक) के बराबर है और यह नहीं करता है।
अगली सूचना तक रोक दिया गया।

2

मेरे लिए, सबसे सरल समाधान (())अभिव्यक्ति के अंदर चर का उपयोग करना था , जैसे:

if ((VAR > 0))
then
  echo "$VAR is a positive integer."
fi

बेशक, यह समाधान केवल तभी मान्य है जब शून्य का मान आपके एप्लिकेशन के लिए मायने नहीं रखता है। यह मेरे मामले में सच हुआ, और यह अन्य समाधानों की तुलना में बहुत सरल है।

जैसा कि टिप्पणियों में बताया गया है, यह आपको एक कोड निष्पादन हमले के अधीन कर सकता है: (( ))ऑपरेटर मूल्यांकन करता है VAR, जैसा कि बैश (1) मैन पेज के Arithmetic Evaluationअनुभाग में कहा गया है । इसलिए, आपको इस तकनीक का उपयोग नहीं करना चाहिए जब सामग्री की स्रोत अनिश्चित हो (न ही आपको चर विस्तार के किसी अन्य रूप का उपयोग करना चाहिए, निश्चित रूप से)।VAR


तुम भी साथ सरल जा सकते हैंif (( var )); then echo "$var is an int."; fi
आरोन आर।

2
लेकिन यह भी नकारात्मक पूर्णांक के लिए सही वापस आ जाएगा, @ARonr, न कि क्या ओपी की तलाश में था।
ट्रेबोर रूड

2
यह खतरनाक है, देखें: एन = 1; var = "n"; अगर (var); तब प्रतिध्वनि "$ var एक int है।"; फाई
जारो

2
यह एक बहुत बुरा विचार है और मनमाना कोड निष्पादन के अधीन है: इसे स्वयं आज़माएँ VAR='a[$(ls)]'; if ((VAR > 0)); then echo "$VAR is a positive integer"; fi:। इस बिंदु पर आपको खुशी है कि मैंने इसके बजाय कुछ बुरी कमांड दर्ज नहीं की है ls। क्योंकि ओपी उपयोगकर्ता इनपुट का उल्लेख करता है , मुझे वास्तव में उम्मीद है कि आप उत्पादन कोड में उपयोगकर्ता इनपुट के साथ इसका उपयोग नहीं कर रहे हैं!
ग्नौरफ_गनीउरफ

यदि स्ट्रिंग में कुछ अंक हैं जैसे यह काम नहीं करता है:agent007
brablc

1

या sed के साथ:

   test -z $(echo "2000" | sed s/[0-9]//g) && echo "integer" || echo "no integer"
   # integer

   test -z $(echo "ab12" | sed s/[0-9]//g) && echo "integer" || echo "no integer"
   # no integer

बैश और कुछ अन्य "बॉर्न प्लस" गोले में आप कमांड प्रतिस्थापन और बाहरी कमांड से बच सकते हैं test -z "${string//[0-9]/}" && echo "integer" || echo "no integer"... हालांकि यह मूल रूप से डेनिस विलियमसन के जवाब की
ट्रिपल

धन्यवाद! एकमात्र उत्तर जो वास्तव में यहाँ काम करता है!
उपयोगकर्ता

मूक विकल्प:if [[ -n "$(printf "%s" "${2}" | sed s/[0-9]//g)" ]]; then
उपयोगकर्ता

0

इग्नासियो वाज़क्वेज़-अब्राम्स से उत्तर को जोड़ना। यह पूर्णांक के पूर्व चिह्न के लिए अनुमति देगा, और यह दशमलव बिंदुओं के रूप में किसी भी संख्या को शून्य की अनुमति देगा। उदाहरण के लिए, यह +45.00000000 को पूर्णांक माना जाएगा।
हालाँकि, दशमलव बिंदु समाहित करने के लिए $ 1 को स्वरूपित किया जाना चाहिए। 45 को यहां पूर्णांक नहीं माना जाता है, लेकिन 45.0 है।

if [[ $1 =~ ^-?[0-9]+.?[0]+$ ]]; then
    echo "yes, this is an integer"
elif [[ $1 =~ ^\+?[0-9]+.?[0]+$ ]]; then
    echo "yes, this is an integer"
else
    echo "no, this is not an integer"
fi

क्या एक कारण है कि आप सकारात्मक और नकारात्मक संख्याओं के लिए दो अलग-अलग नियमित अभिव्यक्तियों का उपयोग करते हैं, इसके बजाय ^[-+]?[0-9]...?
ट्रिपलए

0

हंसी के लिए मैंने मोटे तौर पर सिर्फ ऐसा करने के लिए कार्यों का एक सेट तैयार किया (is_string, is_int, is_float, अल्फा स्ट्रिंग, या अन्य) है, लेकिन ऐसा करने के लिए अधिक कुशल (कम कोड) तरीके हैं:

#!/bin/bash

function strindex() {
    x="${1%%$2*}"
    if [[ "$x" = "$1" ]] ;then
        true
    else
        if [ "${#x}" -gt 0 ] ;then
            false
        else
            true
        fi
    fi
}

function is_int() {
    if is_empty "${1}" ;then
        false
        return
    fi
    tmp=$(echo "${1}" | sed 's/[^0-9]*//g')
    if [[ $tmp == "${1}" ]] || [[ "-${tmp}" == "${1}" ]] ; then
        #echo "INT (${1}) tmp=$tmp"
        true
    else
        #echo "NOT INT (${1}) tmp=$tmp"
        false
    fi
}

function is_float() {
    if is_empty "${1}" ;then
        false
        return
    fi
    if ! strindex "${1}" "-" ; then
        false
        return
    fi
    tmp=$(echo "${1}" | sed 's/[^a-z. ]*//g')
    if [[ $tmp =~ "." ]] ; then
        #echo "FLOAT  (${1}) tmp=$tmp"
        true
    else
        #echo "NOT FLOAT  (${1}) tmp=$tmp"
        false
    fi
}

function is_strict_string() {
    if is_empty "${1}" ;then
        false
        return
    fi
    if [[ "${1}" =~ ^[A-Za-z]+$ ]]; then
        #echo "STRICT STRING (${1})"
        true
    else
        #echo "NOT STRICT STRING (${1})"
        false
    fi
}

function is_string() {
    if is_empty "${1}" || is_int "${1}" || is_float "${1}" || is_strict_string "${1}" ;then
        false
        return
    fi
    if [ ! -z "${1}" ] ;then
        true
        return
    fi
    false
}
function is_empty() {
    if [ -z "${1// }" ] ;then
        true
    else
        false
    fi
}

यहां कुछ परीक्षणों के माध्यम से चलाएं, मैंने परिभाषित किया कि -44 एक int है, लेकिन 44- आदि नहीं है:

for num in "44" "-44" "44-" "4-4" "a4" "4a" ".4" "4.4" "-4.4" "09" "hello" "h3llo!" "!!" " " "" ; do
    if is_int "$num" ;then
        echo "INT = $num"

    elif is_float "$num" ;then
        echo "FLOAT = $num"

    elif is_string "$num" ; then
        echo "STRING = $num"

    elif is_strict_string "$num" ; then
        echo "STRICT STRING = $num"
    else
        echo "OTHER = $num"
    fi
done

आउटपुट:

INT = 44
INT = -44
STRING = 44-
STRING = 4-4
STRING = a4
STRING = 4a
FLOAT = .4
FLOAT = 4.4
FLOAT = -4.4
INT = 09
STRICT STRING = hello
STRING = h3llo!
STRING = !!
OTHER =  
OTHER = 

नोट: लीडिंग 0 जब ऑक्टल जैसे नंबरों को जोड़ते हुए कुछ और अनुमान लगा सकता है तो बेहतर होगा कि आप उन्हें '09' को एक इंट (जो मैं कर रहा हूं) के रूप में मानें (जैसे कि मैं कर रहा हूं expr 09 + 0)

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