在if语句中获取命令输出,并将其输出到变量

时间:2019-07-08 10:45:15

标签: bash ansible

我需要Ansible主机文件中的条目,并以某种方式进行格式化,以便可以在Linux上的普通主机文件中使用它。通过在脚本中两次调用nslookup,我可以实现这一目标。

我只调用一次nslookup的目标,但我不知道如何将if语句中的nslookup输出转换为变量。

我已经尝试过了

if [[ $(nslookup $i > $DNSHOST) && $? == 0 ]]
if [[ $(nslookup $i > $DNSHOST && $? == 0) ]]
if  (($(nslookup $i > $DNSHOST) && $? == 0))
if [[ $("nslookup $i > $DNSHOST") && $? == 0 ]]

...以及许多其他组合,但无济于事?

此脚本可以工作,并且可以完成工作:

for i in $HOSTS; do

                if [[ $(nslookup $i) && $? == 0 ]]; then

                        nslookup $i | sed -e '1,3d;6d' | cut -d$'\t' -f2 | cut -d ' ' -f2 | xargs -n2 | awk '{print $2,"\t",$1}'

                fi
done

这是我无法上班的东西:

for i in $HOSTS; do

        if [[ $(nslookup $i > $DNSHOST) && $? == 0 ]]; then

                cat $DNSHOST | sed -e '1,3d;6d' | cut -d$'\t' -f2 | cut -d ' ' -f2 | xargs -n2 | awk '{print $2,"\t\t",$1}'

        fi
done

当我使用双引号时,出现错误“目录不存在”。 否则,它只会在没有nslookup的情况下循环所有主机列表。

2 个答案:

答案 0 :(得分:1)

不确定,您想要什么。

但这看起来很好奇:

if [[ $(nslookup $i > $DNSHOST) && $? == 0 ]]

请尝试:

if nslookup $i > $DNSHOST

答案 1 :(得分:0)

如果要捕获nslookup输出,仍然可以在if命令的条件部分中执行该操作:

if output=$( nslookup ... ); then 
    # do something with "$output"
fi

if [[ $(nslookup $i > $DNSHOST) && $? == 0 ]]

的问题
  • 您有2个表达式:$(nslookup $i > $dnshost)$? == 0
  • &&发生短路,因此,如果第一个表达式的计算结果为false,则布尔结果不能为true,并且不考虑第二个表达式。
  • 第一个表达式:
    • 由于只有一个操作数,因此,真/假取决于操作数的字符串长度
    • 当您将输出重定向到文件中时,命令替换的标准输出结果将为空字符串。
    • 作为表达式的空字符串为假。

请注意,if命令的条件不必放在方括号中。如果您想编写一个if命令来对某些命令的退出状态起作用,那么您只需编写
if some_command; then ...; else ...; fi

在交互式提示下:help ifhelp [[help test