【问题标题】:bash - how to use if loop correctlybash - 如何正确使用 if 循环
【发布时间】:2016-01-13 18:22:02
【问题描述】:

我对脚本编写相当陌生,目前正在尝试创建一个简单的 if else 循环,该循环遍历其中列出了 ipaddress 和 hostname 的文件。它基本上检查他们是否在线。

这就是我所拥有的:

for ip in `cat /tmp/blabla2 | awk '{print $1}'` ; do
if ping -c1 $ip >/dev/null 2>&1; then
fqdn=`host $ip | awk '{print $5}'`
echo "$ip $fqdn is UP"
else
fqdn=`host $ip | awk '{print $5}'`
echo "$ip $fqdn is DOWN"
fi
done

我很难理解的是如何在不使用类似主机 $ip 的情况下包含主机名

当主机名已经在 /tmp/blabla2 的同一行时,似乎没有必要再进行一次主机查找

我尝试过使用 awk print 处理 if 循环中的变量,但没有成功。

对此有任何提示/技巧吗? 感谢您的宝贵时间

【问题讨论】:

  • 为什么要通过管道将 blabla2 传输到 awk 以仅打印第一列?
  • 测试文件“blabla2”包含:123.123.123.123 test.com
  • 只打印 $2 而不是 $1 不够吗?
  • 我想这也可以,但是我将如何列出 IP 地址?这基本上就是我目前所坚持的。回声 $ip 和 $fqdn .. 谢谢伙计。
  • 我猜你想同时分配两个变量。检查这个例子read a b < <(echo 1 2); echo $a $b

标签: bash loops if-statement


【解决方案1】:

不要在 for 循环 (reference) 中读取文件的行。 read 命令可以从文件的行中读取多个单词。

while read -r ip host; do
    if ping -c1 $ip >/dev/null 2>&1; then
        echo "$ip $host is UP"
    else
        echo "$ip $host is DOWN"
    fi
done < /tmp/filename

缩进对于维护自己的代码非常重要。

【讨论】:

  • 感谢 Glenn,我确实尝试正确保持缩进,但发现在 stackoverflow 上很难做到。感谢您的回答。这对我帮助很大。 :)
  • 关于缩进,我经常在我的编辑器里写代码,然后粘贴到这里的答案框中。另见stackoverflow.com/editing-helpctrl-k 很有用)
猜你喜欢
  • 1970-01-01
  • 2016-02-06
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 2013-12-20
  • 2021-10-19
相关资源
最近更新 更多