21

IPアドレスの有効性をチェックする小さなコードがあります:

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 アドレスではありません

4

2 に答える 2

19

戻りコードは$?、コマンドの終了後に特殊パラメーターで使用できます。通常、別のコマンドを実行する前に値を保存する場合にのみ使用する必要があります。

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"

以下は、単純で慣用的な書き方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 ))
    }
}

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

于 2013-07-10T14:39:35.420 に答える
12

終了ステータスが検査される場合、括弧は必要ありません:

if valid_ip $IP ; then
    ...

他のコマンドを呼び出すのと同じ方法で関数を呼び出すだけです。

于 2013-07-10T14:30:12.403 に答える