2013-07-10 5 views
14

Ich habe ein kleines Stück Code, die IP-Adresse Gültigkeit überprüft:Wie Bash-Return-Code in bedingten verwenden?

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 
} 

Aber ich habe Probleme mit seiner Verwendung in bash conditionals habe. Ich habe viele Techniken ausprobiert, um den Rückgabewert zu testen, aber die meisten scheitern bei mir.

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

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

etc. etc. Kann jemand empfehlen, was soll ich hier tun?

EDIT

Ihre Vorschläge Im Anschluss habe ich so etwas wie verwendet:

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

und ich bekomme Fehler wie

IP: "10.9.205.228" ist keine gültige IP Adresse

Antwort

12

Der Rückkehrcode ist im speziellen Parameter $? nach dem Beenden des Befehls verfügbar. Normalerweise müssen Sie es nur verwenden, wenn Sie den Wert speichern, bevor einen anderen Befehl ausgeführt wird:

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

oder wenn Sie zwischen verschiedenen Nicht-Null-Status zu unterscheiden:

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 

Andernfalls Sie lassen sie die verschiedenen Betreiber es überprüfen implizit:

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

valid_IP "$IP" && echo "OK" 

Hier ist ein einfacher, idiomatischer Weg 0 des Schreibens:

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)) 
    } 
} 

Es gibt zwei Ausdrücke, die [[...]] und die { ... }; die beiden werden durch && verbunden. Wenn der erste Fehler auftritt, schlägt valid_ip fehl. Wenn es erfolgreich ist, wird der zweite Ausdruck (die zusammengesetzte Aussage) ausgewertet. Die read teilt die Zeichenfolge in vier Variablen auf, und jede wird separat innerhalb des arithmetischen Ausdrucks getestet. Wenn alle wahr sind, dann ist ((...)) erfolgreich, was bedeutet, dass die && Liste erfolgreich ist, was bedeutet, dass valid_ip erfolgreich ist. Keine Notwendigkeit, explizite Rückgabecodes zu speichern oder zurückzugeben.

+0

Bitte werfen Sie einen Blick auf meine Bearbeitung. – Patryk

+3

Die Shell interpretiert 0 als Erfolg und nicht Null als Fehler, im Gegensatz zur üblichen Booleschen Interpretation.'valid_IP' sollte 0 zurückgeben, wenn die IP-Adresse gültig ist und sonst 1. – chepner

+0

nur Problem ist, wird dies nicht mit 'set -e' funktionieren –

8

Keine Klammern erforderlich, wenn der Exit-Status überprüft wird:

if valid_ip $IP ; then 
    ... 

einfach die Funktion in der Art und Weise rufen Sie einen anderen Befehl aufrufen würden.

+0

Bitte werfen Sie einen Blick auf meine Bearbeitung. – Patryk

+0

@Patryk: Beachten Sie, dass Befehle bei Erfolg 0 zurückgeben. Geben Sie 0 für eine gültige IP-Adresse zurück. – choroba

+0

Aber ich dachte '$ {ip [0]} -le 255' ist zu überprüfen, dass das erste Oktett kleiner oder gleich 255 ist und so weiter für die restlichen Oktetts. – Patryk