2013-08-07 48 views
0

需要一些额外的眼睛这一个...SH变量不工作,如果空白

dns_lookup() { 
    ip_set 
    if [ `ip_ping ${ip_address}` -eq 0 ] 
    then 
      host="" 
      dig +short -x ${ip_address} | sed 's/\.$//g' | while read host 
      do 
        if [ -z "${host}" ] 
        then 
          host="unknown" 
        fi 
        echo "${ip_address},${host}" 
      done 
    fi 

}

我得到想要的结果,如果IP是可侦测并具有DNS名称。如果ip可以ping但没有DNS名称,我不会得到结果。


ip_set() { 
     ip_address="${a}.${b}.${c}.${d}" 
} 

ip_ping() { 
    timeout ${delay} ping -q -c 1 -i 1 -W 1 -w 4 $1 > /dev/null 2>&1 ; echo $? 
} 

+0

什么是'ip_set'和'ip_ping'? '$ ip_address'的价值是什么?什么*确切*不“得到结果”是什么意思? –

回答

0

你没有得到结果时,有没有主机名,因为在没有线读取你while read循环永远不会运行。您应该让您的打印代码无论如何运行:

host=$(dig +short -x "${ip_address}" | sed 's/\.$//g') 
if [ -z "${host}" ] 
then 
    host="unknown" 
fi 
printf "${ip_address},%s\n" $host 

另外,您正在考虑您的情况错误。您不应该回显退出状态并将其作为文本进行比较。你应该让你的命令的退出状态是你的函数的退出状态:

ip_ping() { 
    timeout ${delay} ping -q -c 1 -i 1 -W 1 -w 4 $1 > /dev/null 2>&1 
    # functions implicitly 'return $?' if you don't specify anything else 
} 

现在你可以很容易地检查你的函数:

if ip_ping "$ip_address" 
then 
    echo "It worked" 
else 
    echo "It failed.." 
fi 
+0

在你的例子中,如果主机是真的,主机是如何定义的?我得到所有未知主机的列表。 – mrlayance

+0

有一个错误,是的。我已经更新了它。 –

+0

好的,那是有效的。也许我没有正确解释自己。如果IP响应ping,我只想要结果DNS或不。我收到了一份完整的清单。我的原始代码刚刚列出了响应ping的ip。 – mrlayance

0

也许这就是你所需要的。告诉我你是否需要修改。

dns_lookup() { 
    ip_set 
    if [ `ip_ping ${ip_address}` -eq 0 ] 
    then 
     host="" 
     dig +short -x ${ip_address} | sed 's/\.$//g' | { 
      hashosts=false 
      while read host 
      do 
       if [ -n "${host}" ] 
       then 
        hashosts=true 
        echo "${ip_address},${host}" 
       fi 
      done 
      [ "${hashosts}" = false ] && echo "${ip_address},unknown" 
     } 
    fi 
} 

我也会建议改变函数ip_ping,但是that_other_guy已经做到了。