2013-07-10 12 views
14

Mam mały kawałek kodu, który sprawdza ważność adresu IP:Jak korzystać z kodu powrotu bash w trybie warunkowym?

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 
} 

ale mam problemy z jego użytkowania w bash warunkowych. Próbowałem wielu technik, aby sprawdzić jego wartość zwrotu, ale większość z nich zawiodła.

itp. Czy ktoś może sugerować, co powinienem tu zrobić?

EDIT

Po swoimi sugestiami Użyłem coś takiego:

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

i pojawiają się błędy jak

IP: "10.9.205.228" nie jest poprawnym IP adres:

Odpowiedz

12

Kod powrotu jest dostępny w specjalnym parametrze $? po wyjściu polecenia. Zazwyczaj wystarczy użyć go, gdy chcesz zapisać jego wartości przed uruchomieniem kolejnego polecenia:

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

lub jeśli trzeba rozróżniać między różnymi niezerowych statusów:

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 

przeciwnym razie niech różni operatorzy sprawdź to niejawnie:

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

valid_IP "$IP" && echo "OK" 

Oto prosty, idiomatyczne sposób pisania valid_ip:

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

Istnieją dwa wyrażenia, tym [[...]] i { ... }; do dwóch dołącza &&. Jeśli pierwsza się nie powiedzie, to ulegnie uszkodzeniu valid_ip. Jeśli się uda, wówczas zostanie ocenione drugie wyrażenie (instrukcja złożona). read dzieli łańcuch na cztery zmienne, a każdy jest testowany osobno w wyrażeniu arytmetycznym. Jeśli wszystko jest prawdą, oznacza to, że ((...)) się powiedzie, co oznacza, że ​​lista && kończy się pomyślnie, co oznacza, że ​​valid_ip się powiedzie. Nie ma potrzeby przechowywania ani zwracania wyraźnych kodów powrotu.

+0

Proszę spojrzeć na moją edycję. – Patryk

+3

Powłoka interpretuje 0 jako sukces, a niezerową jako niepowodzenie, w przeciwieństwie do zwykłej interpretacji Boolean.'valid_IP' powinno zwracać 0, jeśli adres IP jest prawidłowy, a 1 w przeciwnym razie. – chepner

+0

Jedynym problemem jest to, że nie będzie działać z opcją 'set -e' –

8

Brak nawiasów potrzebne jeśli kod wyjścia jest kontrolowane:

if valid_ip $IP ; then 
    ... 

Wystarczy wywołać funkcję w sposób, jaki można wywołać dowolną inną komendę.

+0

Proszę spojrzeć na moją edycję. – Patryk

+0

@Patryk: Zwróć uwagę, że polecenia zwracają 0 po pomyślnym zakończeniu. Zwróć 0, aby uzyskać prawidłowy adres IP. – choroba

+0

Ale myślałem, że '$ {ip [0]} -le 255' to sprawdzenie, czy pierwszy oktet jest mniejszy lub równy 255 i tak dalej dla pozostałych oktetów. – Patryk

Powiązane problemy