2013-07-10 11 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のようなエラーが出る::私はのようなものを使用している、あなたの提案に続き

EDIT

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

二つの表現、[[...]]{ ... }があります。 2つは&&によって結合されます。最初に失敗すると、valid_ipが失敗します。それが成功すると、2番目の式(複合文)が評価されます。 readは文字列を4つの変数に分割し、それぞれを算術式内で別々にテストします。すべてが真である場合、((...))が成功します。つまり、&&リストが成功したことを意味します。つまり、valid_ipが成功します。明示的な戻りコードを保管したり返す必要はありません。

+0

私の編集を見てください。 – Patryk

+3

シェルは0を成功として解釈し、失敗として0以外を通常のブール解釈の逆と解釈します。'valid_IP'は、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

関連する問題