2013-08-07 43 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已經做到了。