यह जांचने का सबसे अच्छा तरीका क्या होगा कि $ 1 / बिन / डैश में पूर्णांक है?
बाश में, मैं कर सकता था:
[[ $1 =~ ^([0-9]+)$ ]]
लेकिन ऐसा लगता है कि पोसिक्स अनुपालन नहीं करता है और डैश इसका समर्थन नहीं करता है
यह जांचने का सबसे अच्छा तरीका क्या होगा कि $ 1 / बिन / डैश में पूर्णांक है?
बाश में, मैं कर सकता था:
[[ $1 =~ ^([0-9]+)$ ]]
लेकिन ऐसा लगता है कि पोसिक्स अनुपालन नहीं करता है और डैश इसका समर्थन नहीं करता है
जवाबों:
निम्नलिखित पूर्णांकों का पता लगाते हैं, सकारात्मक या नकारात्मक, और इसके अंतर्गत काम करते dashहैं और POSIX हैं:
echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"
case "${1#[+-]}" in
''|*[!0-9]*)
echo "Not an integer" ;;
*)
echo "Integer" ;;
esac
या, :(nop) कमांड के थोड़े से उपयोग के साथ :
! case ${1#[+-]} in *[!0-9]*) :;; ?*) ! :;; esac && echo Integer
चाहे dash, bash, ksh, zsh, POSIX sh, या posh( "बॉर्न शैल के एक reimplementation" sh ); caseनिर्माण सबसे व्यापक रूप से उपलब्ध है और विश्वसनीय है:
case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac
dash? यह मेरे लिए काम करता है bashलेकिन नहीं dash।
dash; echo $?केस कमांड के बाद मैंने जो परिणाम जोड़ा, उससे पूछताछ करना ।
posh("बॉर्न शेल का एक पुन: कार्यान्वयन") को भी उस समाधान के साथ कोई समस्या नहीं है, हालांकि।
case; एक कारण यह है कि आप जिस बग का वर्णन करते हैं, एक और जो संपादकों में ऐसी विशेषताएं हैं जो मेल कोष्ठक (vim) से मेल खाने पर निर्भर करती हैं यह बहुत बेहतर समर्थन देता है, और कम से कम मुझे व्यक्तिगत रूप से बेहतर लगता है कि उनका मिलान हो। - WRT poshPOSIX होने के नाते; ठीक है, मैन पेज से बोली कि मैंने कुछ और सुझाया है, लेकिन कोई भी इस तरह के अनौपचारिक बयानों पर भरोसा नहीं कर सकता है, मुझे लगता है। पुराने बोर्न शेल वैसे भी इतना महत्वपूर्ण नहीं है कि अब हम पोसिक्स युग में हैं।
आप -eqअपने साथ, स्ट्रिंग पर परीक्षण का उपयोग कर सकते हैं :
$ dash -c 'a="a"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: a
not a number
$ dash -c 'a="0xa"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: 0xa
not a number
$ dash -c 'a="-1"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
number
यदि त्रुटि संदेश एक समस्या है, तो /dev/nullनिम्न त्रुटि आउटपुट को :
$ dash -c 'a="0xa"; [ "$a" -eq "$a" ] 2>/dev/null|| echo no'
no
" 023 "एक संख्या है। ध्यान दें कि यह डैश के साथ काम करता है, लेकिन अन्य सभी POSIX गोले नहीं क्योंकि व्यवहार अप्रभावित है यदि ऑपरेंड नोट किए गए पूर्णांक हैं। उदाहरण के लिए, ksh के साथ, यह कहेगा कि SHLVLया 1+1एक संख्या है।
एक अंकगणितीय विस्तार के रूप में इसका उपयोग करने का प्रयास करें, और देखें कि क्या यह काम करता है। दरअसल, आपको इससे थोड़ा सख्त होने की जरूरत है, क्योंकि अंकगणितीय विस्तार उदाहरण के लिए अग्रणी और अनुगामी रिक्त स्थान की अनदेखी करेगा। तो एक अंकगणितीय विस्तार करें, और सुनिश्चित करें कि विस्तारित परिणाम मूल चर से बिल्कुल मेल खाता है।
check_if_number()
{
if [ "$1" = "$((${1}))" ] 2>/dev/null; then
echo "Number!"
else
echo "not a number"
fi
}
यह नकारात्मक संख्याओं को भी स्वीकार करेगा - यदि आप वास्तव में उन्हें बाहर करने के लिए मतलब रखते हैं, तो एक अतिरिक्त जांच जोड़ें $((${1} >= 0))।
[[
$(( ... ))? यदि हां, तो मेरा जवाब अभी भी भौतिक रूप से सही होना चाहिए, मुझे बस कुछ अतिरिक्त उद्धरण जोड़ने की आवश्यकता है।
check_if_number 1.2और समारोह लौट आया: dash: 3: arithmetic expression: expecting EOF: "1.2"
शायद साथ expr?
if expr match "$1" '^\([0-9]\+\)$' > /dev/null; then
echo "integer"
else
echo "non-integer"
fi
matchहै और न ही \+POSIX हैं। यह भी कहेंगे 0 एक संख्या नहीं है। आप चाहते हैंexpr "x$1" : 'x[0-9]\{1,\}$'
POSIX सिस्टम में, आप expr का उपयोग कर सकते हैं :
$ a=a
$ expr "$a" - 0 >/dev/null 2>&1
$ [ "$?" -lt 2 ] && echo Integer || echo Not Integer
exprकार्यान्वयन कहेंगे कि 9999999999999999999 पूर्णांक नहीं है। POSIX कोई वारंटी नहीं देता है कि यह काम करेगा। व्यवहार में, कम से कम एक जीएनयू प्रणाली पर, यह कहेंगे कि "लंबाई" एक पूर्णांक है।
expr 9999999999999999999 + 0मुझे एक 3 बाहर निकलें स्थिति देता है और expr -12 + 0और expr length + 0मुझे जीएनयू expr के साथ एक 0 बाहर निकलें दर्जा देने ( + stringबलों stringजीएनयू के साथ एक स्ट्रिंग के रूप में विचार किया जाना expr। expr "$a" - 0बेहतर काम करेंगे)।
-12है कि एक वैध पूर्णांक है, और 9999999999999999999एक अतिप्रवाह दिया।
यहाँ एक सरल विधि है जिसका उपयोग मुरु के उत्तर की तरह है :
IsInteger() # usage: IsInteger string
{ # returns: flag
[ "$1" -eq "$1" ] 2> /dev/null
}
उदाहरण:
p= n=2a3; IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"
p= n=23; IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"
आउटपुट:
'2a3' isn't an integer
'23' is an integer
foo\n123\nbarपूर्णांक नहीं है, लेकिन यह परीक्षा उत्तीर्ण होगी।