2013-07-10 49 views
14

我有一個小小的一段代碼,檢查IP地址的有效性:如何在條件中使用bash返回碼?

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 
} 

但我有它在bash條件語句使用問題。我已經嘗試了很多技巧來測試它的返回值,但其中大部分都失敗了。

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 

,我得到這樣的錯誤

IP: 「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

shell將0解釋爲成功,將非零解釋爲失敗,與通常的布爾解釋相反。如果IP地址有效,'valid_IP'應該返回0,否則返回1。 – chepner

+0

唯一的問題是這不會使用'set -e' –

8

沒有括號如果退出狀態檢查需要:

if valid_ip $IP ; then 
    ... 

就叫你會調用任何其他命令的方式的功能。

+0

請看看我的編輯。 – Patryk

+0

@Patryk:請注意,成功時命令返回0。爲有效的IP返回0。 – choroba

+0

但我想'$ {ip [0]} -le 255'是檢查第一個八位字節是否小於或等於255,以此類推。 – Patryk