एक स्पष्ट उत्तर पहले से ही दिया गया है @charles Dufy और अन्य द्वारा। शुद्ध बैश समाधान निम्नलिखित का उपयोग करेगा:
string="-12,345"
if [[ "$string" =~ ^-?[0-9]+[.,]?[0-9]*$ ]]
then
echo $string is a number
else
echo $string is not a number
fi
यद्यपि वास्तविक संख्याओं के लिए मूलांक बिंदु से पहले संख्या होना अनिवार्य नहीं है ।
फ्लोटिंग नंबरों और वैज्ञानिक संकेतन का अधिक गहन समर्थन प्रदान करने के लिए (सी / फोरट्रान में कई कार्यक्रम या इस तरह से निर्यात करेगा), इस लाइन के लिए एक उपयोगी अतिरिक्त निम्नलिखित होगा:
string="1.2345E-67"
if [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*[eE]?-?[0-9]+$ ]]
then
echo $string is a number
else
echo $string is not a number
fi
इस प्रकार, यदि आप किसी विशिष्ट प्रकार की तलाश कर रहे हैं, तो संख्या के अंतर को समझने का एक तरीका है:
string="-12,345"
if [[ "$string" =~ ^-?[0-9]+$ ]]
then
echo $string is an integer
elif [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*$ ]]
then
echo $string is a float
elif [[ "$string" =~ ^-?[0-9]*[.,]?[0-9]*[eE]-?[0-9]+$ ]]
then
echo $string is a scientific number
else
echo $string is not a number
fi
नोट: हम दशमलव और वैज्ञानिक संकेतन के लिए वाक्यात्मक आवश्यकताओं को सूचीबद्ध कर सकते हैं, एक को अल्पविराम बिंदु के रूप में और साथ ही ""। फिर हम यह दावा करेंगे कि इस तरह का केवल एक ही मूलांक होना चाहिए। एक [ईई] फ्लोट में दो +/- संकेत हो सकते हैं। मैंने औलू के काम से कुछ और नियम सीखे हैं, और खराब तारों जैसे '' '-' 'ईई -1' '' 0-0 '' के खिलाफ परीक्षण किया है। यहाँ मेरा रेगेक्स / सबस्ट्रिंग / एक्सपीआर उपकरण हैं जो प्रतीत हो रहा है:
parse_num() {
local r=`expr "$1" : '.*\([.,]\)' 2>/dev/null | tr -d '\n'`
nat='^[+-]?[0-9]+[.,]?$' \
dot="${1%[.,]*}${r}${1##*[.,]}" \
float='^[\+\-]?([.,0-9]+[Ee]?[-+]?|)[0-9]+$'
[[ "$1" == $dot ]] && [[ "$1" =~ $float ]] || [[ "$1" =~ $nat ]]
} # usage: parse_num -123.456
test && echo "foo" && exit 0 || echo "bar" && exit 1
आपके द्वारा उपयोग किए जा रहे दृष्टिकोण के कुछ अनपेक्षित दुष्प्रभाव हो सकते हैं - यदि प्रतिध्वनि विफल हो जाती है (शायद आउटपुट एक बंद एफडी के लिए है), तोexit 0
छोड़ दिया जाएगा, और फिर कोड कोशिश करेगाecho "bar"
। यदि यह उस पर भी विफल रहता है, तो&&
स्थिति विफल हो जाएगी, और यह भी निष्पादित नहीं करेगाexit 1
! / केif
बजाय वास्तविक बयानों का उपयोग करने से अप्रत्याशित दुष्प्रभावों का खतरा कम होता है।&&
||