/ / बैश फ़ंक्शन के पूर्णांक के रूप में मूल्यांकन मूल्य का मूल्यांकन - बैश, फ़ंक्शन, परीक्षण, तुलना, रिटर्न

बैश फ़ंक्शन के रिटर्न वैल्यू का पूर्णांक - बैश, फ़ंक्शन, परीक्षण, तुलना, रिटर्न के रूप में मूल्यांकन करना

मैं यह जांचने के लिए बैश फ़ंक्शन लिखने की कोशिश कर रहा हूं कि क्या एक चर एक पूर्णांक है। नीचे स्क्रिप्ट में is_number फ़ंक्शन यह चेक करता है।

जब मैं इसे चलाता हूं (1234 के परीक्षण मूल्य के साथ) तो मुझे निम्न त्रुटि संदेश मिलता है:

./test_n2.sh: line 13: [: Checking 1234
1234: integer expression expected
n is not an integrer

मैं उलझन में हूँ: फ़ंक्शन $ लौटाता है?, जो मेरे एक लाइनर परीक्षणों में grep के साथ अभिन्न मूल्यों के लिए सही ढंग से 0 पर सेट है। मुख्य ब्लॉक में पूर्णांक तुलना ["$ रिटेल" -eq 0] के रूप में की जाती है, जो AFAIK पूर्णांक के परीक्षण के लिए सही रूप है।

क्या कोई मदद कर सकता है?

TIA।

#!/usr/bin/env bash

function is_number {
number=$1
echo "Checking $number"
echo $number | /bin/egrep "^[0-9]+$"
return $?
}

n=1234
retval=`is_number $n`

if [ "$retval" -eq 0 ]; then
echo n is an integer
exit 0
fi

echo n is not an integrer
exit 1

उत्तर:

जवाब के लिए 2 № 1

जब आप backticks का उपयोग कर एक चर असाइन करते हैं या $(...), यह कमांड का मानक आउटपुट प्राप्त करता है। एक कमांड का रिटर्न वैल्यू वेरिएबल में डाला जाता है $?। तो आपको करना चाहिए:

is_number $n
retval=$?

या आप बस लिख सकते हैं:

if is_number $n; then
echo n is an integer
exit 0
fi

जवाब के लिए 0 № 2

आपको जरूरत नहीं है grep इस सब के लिए, अपने दम पर खुशी से काम करेंगे, और अधिक कुशलता से:

is_number() {
# Check if $1 only consists of digits
[[ $1 = +([[:digit:]]) ]]
}

तो आप इसे इस प्रकार उपयोग कर सकते हैं:

if is_number 123; then
echo "it"s a number!"
else
echo "it"s not a number!"
fi

निम्नलिखित कैविएट के साथ इसका उपयोग करें: यदि आपको अंकगणित करने की आवश्यकता है, तो अवगत रहें कि अग्रणी शून्य "स्ट्रिंग को रेडिक्स में संख्या के रूप में व्याख्या करने के लिए बाध्य करेगा। इसलिए निम्न त्रुटि है:

a=09
if is_number "$a"; then
echo $((a+1));
else
echo "Not a number"
fi

आपका स्निपेट इसलिए बेहतर लिखा जाता है:

#!/usr/bin/env bash

shopt -s extglob
is_number() {
# Check if $1 only consists of digits
[[ $1 = +([[:digit:]]) ]]
}

n=1234
if is_number "$n"; then
echo "n is an integer"
exit 0
else
echo "n is not an integer"
exit 1
fi

या यदि आपको फ़ंक्शन का रिटर्न मान बचाने की आवश्यकता है is_number:

#!/usr/bin/env bash

shopt -s extglob
is_number() {
# Check if $1 only consists of digits
[[ $1 = +([[:digit:]]) ]]
}

n=1234
is_number "$n"
ret=$?
if ((ret==0)); then
echo "n is an integer"
else
echo "n is not an integer"
fi

exit "$ret"