bash - 如果命令输出不为空,则将输出写入文件

问题描述:

我觉得这应该非常非常容易......但不知何故,我无法弄清楚它。bash - 如果命令输出不为空,则将输出写入文件

事情很简单。我有以下if语句,我正在使用它来检查IP并查看它们是否具有反向DNS。如果有可用的有效反向DNS,我将它写入文件。如果不是,我写“NXDOMAIN”到同一个文件。

if [[ $(dig +noall +answer -x 10.10.10.10 | grep -m 1 PTR | awk '{ print $5 }') ]]; then 
     dig +noall +answer -x 10.10.10.10 | grep -m 1 PTR | awk '{ print $5 }' > /root/IP 
else 
     echo "NXDOMAIN" > /root/IP 
fi 

这工作正常,但它运行命令两次,不必要的。有没有办法,如果命令返回一个有效的反向DNS,我可以直接输出到一个文件,而无需再次运行该命令?

所以,基本上,像这样:

if [[ $(dig +noall +answer -x 10.10.10.10 | grep -m 1 PTR | awk '{ print $5 }') ]]; then 
     <write output of the above command in the "/root/IP" file> 
else 
     echo "NXDOMAIN" > /root/IP 
fi 

为什么不将其存储在一个变量,像这样:

RevLookup="$(dig +noall +answer -x 10.10.10.10 | grep -m 1 PTR | awk '{ print $5 }')" 
if [[ "$RevLookup" ]]; then 
     echo "$RevLookup" >> /root/IP 
else 
     echo "NXDOMAIN" >> /root/IP 
fi 
+0

谢谢,它肯定有效。我没有提到我在for循环中有这个if语句的事实,并且出于某种原因,我不认为直接在for循环中包含变量。我现在试了一下,完美无瑕! – Andy

+0

很高兴帮助。注意,我在'echo'语句中添加了'>>',所以您将追加到输出文件,而不是每次循环都覆盖它。 – jkdba

+1

您可以使用'echo“$ {RevLookup:-NXDOMAIN}”>>/root/IP'而不是'if'语句。 – chepner

把结果的变量。

REV_DNS=$(dig +noall +answer -x 10.10.10.10 | grep -m 1 PTR | awk '{ print $5 }') 
if [[ $REV_DNS ]] 
then 
    echo "$REV_DNS" > /root/IP 
else 
    echo "NXDOMAIN" > /root/IP 
fi 
+0

不要忘记在'if' – jkdba

+0

@JohnK分号分隔命令,所以做新线的分号。 – selalerer

+1

非常感谢您的信息! – jkdba