2013-07-10 6 views
14

मैं कोड का एक छोटा टुकड़ा है जो की जाँच करता है आईपी पते वैधता:सशर्त में बैश रिटर्न कोड का उपयोग कैसे करें?

function valid_ip() 
{ 
    local ip=$1 
    local stat=1 

    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then 
     OIFS=$IFS 
     IFS='.' 
     ip=($ip) 
     IFS=$OIFS 
     if [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ 
      && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]; then 
      stat=1 
     else 
      stat=0 
     fi 
    fi 
    return $stat 
} 

लेकिन मैं बैश सशर्त में इसके उपयोग के साथ समस्या हो रहा हूँ। मैंने अपने रिटर्न वैल्यू का परीक्षण करने के लिए कई तकनीकों की कोशिश की है लेकिन उनमें से ज्यादातर मुझ पर असफल हो जाते हैं।

if [[ !$(valid_ip $IP) ]]; then 

if [[ $(valid_ip IP) -eq 1 ]]; then 

इत्यादि। क्या कोई सुझाव दे सकता है कि मैं यहां क्या करूँ?

संपादित

अपने सुझाव के बाद मैं की तरह कुछ का इस्तेमाल किया है:

if valid_ip "$IP" ; then 
     ... do stuff 
    else 
     perr "IP: \"$IP\" is not a valid IP address" 
    fi 

और मैं की तरह

आईपी त्रुटियों मिलती है: "10.9.205.228" मान्य IP नहीं है पता

उत्तर

12

वापसी कोड बाहर निकलने के बाद विशेष पैरामीटर $? में उपलब्ध है। आमतौर पर, आप केवल यह उपयोग करने के लिए जब आप किसी अन्य आदेश चलाने से पहले अपने मूल्य सहेजना चाहते की जरूरत है:

valid_ip "$IP1" 
status1=$? 
valid_ip "$IP2" 
if [ $status1 -eq 0 ] || [ $? -eq 0 ]; then 

या आप विभिन्न गैर शून्य स्थितियों के बीच अंतर करने की जरूरत है: अन्यथा, आप

valid_ip "$IP" 
case $? in 
    1) echo valid_IP failed because of foo ;; 
    2) echo valid_IP failed because of bar ;; 
    0) echo Success ;; 
esac 

विभिन्न ऑपरेटरों परोक्ष यह जाँच करें:

if valid_ip "$IP"; then 
    echo "OK" 
fi 

valid_IP "$IP" && echo "OK" 

यहाँ एक सरल, 0 लिखने की मुहावरेदार तरीका है:

valid_ip() { 
    local ip=$1 
    [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] && { 
     IFS='.' read a b c d <<< "$ip" 
     ((a < 255 && b < 255 && c < 255 && d << 255)) 
    } 
} 

दो भाव, [[...]] और { ... } हैं; दोनों && से जुड़े हुए हैं। यदि पहला विफल रहता है, तो valid_ip विफल रहता है। यदि यह बढ़ता है, तो दूसरी अभिव्यक्ति (यौगिक कथन) का मूल्यांकन किया जाता है। read स्ट्रिंग को चार चरों में विभाजित करता है, और प्रत्येक अंकगणितीय अभिव्यक्ति के अंदर अलग से परीक्षण किया जाता है। यदि सभी सत्य हैं, तो ((...)) सफल होता है, जिसका अर्थ है && सूची सफल होती है, जिसका अर्थ है कि valid_ip सफल होता है। स्पष्ट रिटर्न कोड को स्टोर या वापस करने की आवश्यकता नहीं है।

+0

कृपया मेरे संपादन पर एक नज़र डालें। – Patryk

+3

शेल सामान्य बुलीयन व्याख्या के विपरीत, सफलता के रूप में 0 और विफलता के रूप में गैर-शून्य के रूप में व्याख्या करता है।यदि आईपी पता मान्य है, और 1 अन्यथा 'valid_IP' वापस आना चाहिए। – chepner

+0

केवल समस्या यह है कि यह 'set -e' के साथ काम नहीं करेगा –

8

नहीं कोष्ठकों अगर बाहर निकलें स्थिति का निरीक्षण किया की जरूरत:

if valid_ip $IP ; then 
    ... 

बस जिस तरह से आप किसी भी अन्य आदेश कहेंगे में फ़ंक्शन को कॉल करें।

+0

कृपया मेरे संपादन पर एक नज़र डालें। – Patryk

+0

@ पेट्रीक: ध्यान दें कि आदेश सफलता पर 0 लौटाते हैं। वैध आईपी के लिए 0 लौटें। – choroba

+0

लेकिन मैंने सोचा कि '$ {ip [0]} -le 255' यह जांचना है कि पहला ऑक्टेट 255 से कम या बराबर है और शेष ऑक्टेट्स के लिए भी है। – Patryk

संबंधित मुद्दे