調査ネットワーク内にあるホストの応答を確認する

スクリプト名: ipres.sh
書式: ipaddr.sh IPアドレス ネットマスク値
目的: 指定したネットワーク内にある起動中のホストが応答を返すかを調べる
戻り値: 正常動作:0 失敗:1 エラー:9

#!/bin/sh
. Error_Msg.sh && . Arg_Nums.sh && . Tmp_Lock.sh || exit 9
Arg_Nums -eq 2 "$@"

_NETWORK=$(./ipaddr.sh "$1" "$2" | grep NETWORK_ADDRESS | awk '{print $3}')
_NW=($(echo $_NETWORK | sed 's/\./ /g'))
_BROADCAST=$(./ipaddr.sh "$1" "$2" | grep BROADCAST_ADDRESS | awk '{print $3    }')
_BC=($(echo $_BROADCAST | sed 's/\./ /g'))
_CIDR=$(ipaddr.sh "$1" "$2" | grep CIDR | awk '{print $3}')

#引数の確認
[ "$_NETWORK" != "" ] ||\
    { Error_Msg "$0" "Specity IP address and netmask value."; exit 1; }

#ログファイルの確認
Tmp_Lock -lm $_NETWORK-$2 ||\
    { Error_Msg "$0" "Generation of lock file failed."; exit 1; }
trap "Tmp_Lock -lr $_NETWORK-$2; exit 1" 1 2 3 9 15

#ログのタイトル出力
echo "Ping Result: $_NETWORK/$2" | tee "$_TMP_LOCK_FILE"

#pingによる調査とログへの結果出力
while [ ${_NW[0]} -le ${_BC[0]} ]; do
    while [ ${_NW[1]} -le ${_BC[1]} ]; do
        while [ ${_NW[2]} -le ${_BC[2]} ]; do
            while [ ${_NW[3]} -le ${_BC[3]} ]; do
                _IPADDR=$(echo ${_NW[@]} | sed 's/ /\./g')
                if [ "$_IPADDR" != "$_NETWORK" -a\
                     "$_IPADDR" != "$_BROADCAST" ]; then
                    ping -n 1 -w 1 $_IPADDR &>/dev/null
                    if [ $? = 0 ]; then
                        echo "$_IPADDR [ ALIVE ]" | tee -a "$_TMP_LOCK_FILE"
                   else
                        echo "$_IPADDR [ DEAD ]" | tee -a "$_TMP_LOCK_FILE"
                    fi  
                fi  
                _NW[3]=$(( ${_NW[3]} + 1 ))
            done
            _NW[3]=0; _NW[2]=$(( ${_NW[2]} + 1))
        done
        _NW[2]=0; _NW[1]=$(( ${_NW[1]} + 1))
    done
    _NW[1]=0; _NW[0]=$(( ${_NW[0]} + 1))
done