![为什么这个 for 和 while 循环的结果不同?](https://linux22.com/image/58322/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E4%B8%AA%20for%20%E5%92%8C%20while%20%E5%BE%AA%E7%8E%AF%E7%9A%84%E7%BB%93%E6%9E%9C%E4%B8%8D%E5%90%8C%EF%BC%9F%20.png)
我有一个 for 循环:
for host in $(cat ./hosts)
do
echo -e "$host"
ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null
echo -e "\n"
done
和一个 while 循环,它的作用与上面的 for 循环完全相同:
while read host
do
echo -e "$host"
ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null
echo -e "\n"
done <./hosts
Hosts 是一个与包含 for 和 while 循环的脚本位于同一位置的文件,它包含远程服务器的一些主机名。 for 循环打印预期结果(对于主机文件中列出的所有主机),但在 while 循环的情况下,它仅打印第一个主机uptime
并退出!
主机文件每行包含一个主机名。
问题是为什么这两个循环的行为不同?
答案1
问题是 ssh 从标准输入读取,因此它会吃掉所有剩余的行。您可以将其标准输入连接到任何地方:
$ ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null < /dev/null