今天写了个脚本,主要功能是要远程登录一批机器执行命令。自然而然想到的是把机器ip列表放到文件中,然后使用while read line,在循环里用ssh远程登录并执行命令。脚本大概如下:

#!/bin/bash

file=$1while read line
doecho "ip:${line}===================="ssh root@${line} uname -a
done < ${file}

但是奇怪的是,我的file里有一批ip地址,但最终只执行了一次循环,也就是只对第一个ip地址进行了远程命令执行。我还一直以为是脚本或者系统配置有问题,但是把ssh命令注释,运行又是正常的,能读到所有ip。百思不得其解。

最后才发现这个和while语句的输入缓存有关。

执行while语句时,file文件的内容都已经读入缓冲区并重定向给了整个while语句。然后在while循环中调用read语句时,就会读取到下一行内容。然而因为ssh命令默认从标准输入里读取数据,就会把刚才读入while循环里缓冲区的内容使用掉。当下一次执行read时就无法获取输入,while循环也就结束了。

下面我们来实际验证一下:

[root@localhost /home]# cat file
192.168.0.119
192.168.0.120
192.168.0.121
[root@localhost /home]# cat test.sh
#!/bin/bash

file=$1while read line
doecho "ip:${line}===================="ssh root@${line} cat
done < ${file}
[root@localhost /home]# sh test.sh file
ip:192.168.0.119====================
192.168.0.120
192.168.0.121
[root@localhost /home]# 

由上可见,在执行ssh命令时,已经把缓冲区的数据全部使用,也就导致while循环只能读取到一行的问题。

要怎么才能避免这种情况呢?
有两种办法:
1、指定ssh命令的输入为/dev/null
既然ssh默认读取标准输入,那我们就将其输入重定向即可。

ssh root@${line} cat < /dev/null

2、ssh命令使用-n参数,命令手册是这么解释-n参数的,

-n      Redirects stdin from /dev/null (actually, prevents reading from stdin).

因此,同样能达到我们的目的。

算是又涨见识了。。。。

while read line只能读一行内容相关推荐

  1. Groovy快速入门-12-Groovy如何读文件内容和写入文件

    文件读写操作,在编程中经常需要去写的代码,同样在pipeline代码中,一些测试验证的代码也需要去读文件来判断下一步的动作,本篇来介绍如何读文件的groovy代码.然后简单介绍如何写入文件,写入文件比 ...

  2. java多线程按行读取文件_“java”中多线程按行读取txt且每个线程读的内容不能重复,这么求“demo”?...

    展开全部 你把原来程序中直接读的地62616964757a686964616fe4b893e5b19e31333365646234方,改成调用上面的函数,由该函数统一读行.这样,不管是你有 N 个线程 ...

  3. 从Python中readline()函数读取的一行内容中去掉换行符\n

    从Python中readline()函数读取的一行内容中含有换行符\n,很多时候我们需要处理不含有换行符的字符串,此时就要去掉换行符\n. 方法是使用strip()函数. 例子如下: file = o ...

  4. golang 读一行_与golang合作的第一步

    golang 读一行 If you like to understand know why we choose golang in the first as an alternative to pyt ...

  5. Java读按行读文件内容

    功能:使用Java读取文件中的内容,按行读取,并按照行内的空格将一行内容分割成若干个字符串. import java.io.*; /*** @Description: 读行读文件内容,并将一行内容按空 ...

  6. 易语言读文本内容_易读性如何使文本易于阅读

    易语言读文本内容 Your first step in making your texts legible is to understand what legibility means. It is ...

  7. 如果一生只能读 7 本书......(赠)

    程序员书库(ID:CodingBook) 猿妹整编 书单来自:https://medium.com/publishous/if-i-could-read-only-7-books-for-the-re ...

  8. ubuntu修改u盘权限_Ubuntu下提示U盘没有些权限的只能读不能写

    在Windows下,U盘能够正常地读写文件(能复制粘贴),但发现有个文件打不开.然后在Ubuntu LInux下,U对U盘只能读不能写.提示:Read only system. 参考:https:// ...

  9. 分行打印列表python_#python版一行内容分行输出

    python版一行内容分行输出 1.[代码][Python]代码236091543 #python版一行内容分行输出 #依山居 18:14 2015/11/4 #题目来源 http://www.bat ...

最新文章

  1. 150kHz无线导航信号接收板调试-Ver2
  2. Advanced Driver Assistance Systems (ADAS)
  3. Java读取指定路径下的文件列表
  4. C指针原理(2)-ATT汇编
  5. axios中POST请求变成OPTIONS处理
  6. HDU - 6183 Color it 2017广西邀请赛(线段树)
  7. 大数据是如何助德国队打进欧洲杯半决赛的?
  8. 及时复盘的好处_还不会复盘?这篇有最全的复盘介绍
  9. 手机屏幕坏了怎么把数据导出来_手机屏幕失灵怎么办 手机屏幕失灵解决办法【详解】...
  10. 微搭低代码中实现二维码生成
  11. 中华石杉Java面试突击第一季笔记三(分布式缓存)
  12. 涨见识!Java String转int还有这种写法
  13. 蓝色理想:讲解网络端口及其详解的一个好网址
  14. 在线客服系统解决方案:游戏行业
  15. 58同城复试面试复盘
  16. 数学建模——决策树(sklearn)
  17. BP神经网络的汇率预测
  18. c++ - 信息学奥赛一本通答案1001
  19. 【已解决】阿里自动滑块 x5sec 解密 钉钉数据采集
  20. pytorch笔记(四)nn.Conv1d、nn.Conv2d、nn.Conv3d

热门文章

  1. “一个部族,一个民族,一个弗雷尔卓德。”
  2. html文档也称为,文档表示HTML文件,文档中的______________被称为元素
  3. html+css 图片右上角加删除叉,图片删除
  4. css的论文,css
  5. asp.net 输入框在chrome中无法关闭自动提示
  6. Rest ful API的一些基本概念
  7. 计算机科班出身和培训出身有什么区别?
  8. 如何打造一个低效能技术团队?
  9. 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第十四集
  10. 4.1 ipu_common.c分析---入口函数及probe函数分析