【shell】while read line 与for循环的区别

简介: 【背景】 工作过程中遇到要从一个ip列表中获取ip port,然后ssh ip 到目标机器进行特定的操作,但是编写脚本的过程 使用while read line 读取ip列表,在while循环中只读取第一个ip 后就退出脚本的情况。
【背景】
工作过程中遇到要从一个ip列表中获取ip port,然后ssh ip 到目标机器进行特定的操作,但是编写脚本的过程 使用while read line 读取ip列表,在while循环中只读取第一个ip 后就退出脚本的情况。
【介绍】
解释上面遇到的问题之前,先看到for 与while的测试对比,文中ip经过修改。

点击(此处)折叠或打开

  1. #/bin/bash
  2. IPS="10.1.1.10 3001
  3. 10.1.1.10 3003
  4. 10.1.1.11 3001
  5. 10.1.1.11 3002
  6. 10.1.1.11 3004
  7. 10.1.1.11 3005
  8. 10.1.1.13 3002
  9. 10.1.1.13 3003
  10. 10.1.1.13 3004
  11. 10.1.1.14 3002"
  12. echo "====while test ===="
  13. i=0

  14. echo $IPS | while read line
  15. do
  16.     echo $(($i+1))
  17.     echo $line
  18. done


  19. echo "====for test ===="
  20. n=0
  21. for ip in $IPS ;
  22. do
  23.    n=$(($n+1))
  24.    echo $ip
  25.    echo $n
  26. done
输出结果如下:

点击(此处)折叠或打开

  1. ====while test ====
  2. 1
  3. 10.1.1.10 3001 10.1.1.10 3003 10.1.1.11 3001 10.1.1.11 3002 10.1.1.11 3004 10.1.1.11 3005 10.1.1.13 3002 10.1.1.13 3003 10.1.1.13 3004 10.1.1.14 3002
  4. ====for test ====
  5. 10.1.1.10
  6. 1
  7. 3001
  8. 2
  9. 10.1.1.10
  10. 3
  11. 3003
  12. 4
  13. 10.1.1.11
  14. 5
  15. 3001
  16. 6
  17. 10.1.1.11
  18. ....
由例子可见 while read line 是一次性将信息读入并赋值给line ,而for是每次读取一个以空格为分割符的字符串。
【原因】
while中使用重定向机制,IPS中的所有信息都被读入并重定向给了整个while 语句中的line 变量。所以当我们在while循环中再一次调用read语句,就会读取到下一条记录。问题就出在这里,$line中的最后一行已经读完,无法获取下一行记录,从而退出 while循环。

【解决方法】
1 使用ssh -n "command" 
2 ssh "cmd"
目录
相关文章
|
8月前
|
存储 运维 Shell
shell中for while until 三种循环的用法
shell编程中,有几种常见的循环结构,包括for循环、while循环和until循环,总的来说,循环shell编程中扮演着至关重要的角色,它们使得自动化任务变得更加容易,提高了效率,并且可以处理各种各样的编程需求。
333 13
shell中for while until 三种循环的用法
|
8月前
|
人工智能 机器人 Shell
【shell】shell条件判断、循环语句、基本运算符
【shell】shell条件判断、循环语句、基本运算符
|
8月前
|
人工智能 机器人 Shell
【shell】文件读写及read用法
【shell】文件读写及read用法
|
8月前
|
存储 Shell Linux
【Shell 命令集合 文件管理】Linux 读取命令 read命令使用指南
【Shell 命令集合 文件管理】Linux 读取命令 read命令使用指南
104 0
|
4月前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
3月前
|
Shell Docker 容器
使用exec模式与shell模式,执行ENTRYPOINT和CMD的区别
结合 `exec`与 `shell`模式,`ENTRYPOINT`与 `CMD`在Docker容器启动时的交互方式展现出不同的特点。选择哪种模式,取决于对执行环境的纯净度、性能需求以及是否需要利用shell特性。理解这些细微差别,有助于更精细地控制容器的行为,优化应用部署与管理流程。
125 0
|
3月前
|
JSON Java Shell
Dockerfile中RUN、CMD、ENTRYPOINT、SHELL命令的区别
理解这些指令的差异和应用场景,有助于构建高效、灵活且易于管理的Docker镜像。在实际应用中,根据需要选择合适的指令,可以有效地控制镜像构建和容器运行的行为。
252 0
|
8月前
|
Linux Shell 文件存储
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(深入df和dh的区别和探索)
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(深入df和dh的区别和探索)
203 1
|
6月前
|
Shell 测试技术 Linux
Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值
Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值
77 3
|
5月前
|
资源调度 网络协议 Shell
在Linux中,Linux内核和Shell有何区别?
在Linux中,Linux内核和Shell有何区别?