Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >while read line 与for循环的区别

while read line 与for循环的区别

作者头像
用户1278550
发布于 2019-05-23 10:16:51
发布于 2019-05-23 10:16:51
1.5K00
代码可运行
举报
文章被收录于专栏:idbaidba
运行总次数:0
代码可运行

一 背景

工作过程中遇到要从一个ip列表中获取ip port,然后ssh ip 到目标机器进行特定的操作,但是编写脚本的过程 使用while read line 读取ip列表,在while循环中只读取第一个ip 后就退出脚本的情况。

二 介绍

解释上面遇到的问题之前,先看到for 与while的测试对比,文中ip经过修改。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#/bin/bashIPS="10.1.1.10 300110.1.1.10 300310.1.1.11 300110.1.1.11 300210.1.1.11 300410.1.1.11 300510.1.1.13 300210.1.1.13 300310.1.1.13 300410.1.1.14 3002"echo "====while test ===="i=0
echo $IPS | while read linedo    echo $(($i+1))    echo $linedone

echo "====for test ===="n=0for ip in $IPS ;do   n=$(($n+1))   echo $ip   echo $ndone

输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
====while test ====110.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====for test ====10.1.1.1013001210.1.1.1033003410.1.1.1153001610.1.1.11....

由例子可见 while read line 是一次性将信息读入并赋值给line ,而for是每次读取一个以空格为分割符的字符串。

三 原因

while中使用重定向机制,IPS中的所有信息都被读入并重定向给了整个while 语句中的line 变量。所以当我们在while循环中再一次调用read语句,就会读取到下一条记录。问题就出在这里,$line中的最后一行已经读完,无法获取下一行记录,从而退出 while循环。

解决方法

1 使用ssh -n "command" 2 ssh "cmd" < /dev/null 将ssh 的输入重定向输入。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yangyidba 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux shell脚本使用while循环执行ssh的注意事项
如果要使用ssh批量登录到其它系统上操作时,我们会采用循环的方式去处理,那么这里存在一个巨大坑,你必须要小心了。 一、场景还原: 我现在是想用一个脚本获取一定列表服务器的运行时间,首先我建立一个名字为ip.txt的IP列表(一个IP一行),再建好密钥实现不用密码直接登录。然后写脚本如下: #!/bin/bash while read ips; do echo $ips; done < ip.txt 脚本实现了逐行读取列表中的IP,但是: #!/bin/bash while read i
小小科
2018/05/03
4.2K0
Shell中的一个知识点
今天在写一个shell脚本的时候,使用到了ssh这个命令,在实际操作过程中遇到了一个问题,这里我把问题重新复现一下,首先,我们创建一个文件test.lst里面写上四条记录,然后是使用一个脚本循环的去调用这个文件里面的四条记录,如下:
AsiaYe
2019/11/06
3680
while read line - [linux学习]
循环中的重定向 或许你应该在其他脚本中见过下面的这种写法: while read line do … done < file 刚开始看到这种结构时,很难理解< file是如何与循环配合在一起工作的。因为循环内有很多条命令,而我们之前接触的重定向都是为一条命令工作的。这里有一个原则,这个原则掌握好了,这个问题就很简单了: 对循环重定向的输入可适用于循环中的所有需要从标准输入读取数据的命令; 对循环重定向的输出可适用于循环中的所有需要向标准输出写入数据的命令; 当在循环内部显式地使用输入或输出重定向,内部重定向覆盖外部重定向。 上面的while结构中,read命令是需要从标准输入中读取数据的。我们来详细了解一下read命令的用法吧,这个命令是shell脚本中使用频率最高的命令之一。 read 先来看一下read的命令语法: read arg1 arg2 arg3 arg4 … read是一个用来赋值的命令,它需要从标准输入获得值,然后把这些值按位置依次赋值给变量arg1、arg2、arg3、arg4…,输入的时候以空格作为字段分隔符。 read的一个最大特性是可以在脚本中产生交互,因为它从标准输入读取数据。read之所以很常用,一是因为我们经常需要赋值,二是因为它可以交互,三是read能够一次给多个变量赋值。 readhostipnamelinux10.0.0.1licongreadhostipnamelinux10.0.0.1licong read host ip name linux 10.0.0.1 licong echo hosthosthost ip namelinux10.0.0.1licongnamelinux10.0.0.1licongname linux 10.0.0.1 licong 可以看到,linux、10.0.0.1、licong分别被赋值给了变量host、ip和name。再看: readhostiplinux10.0.0.1licongreadhostiplinux10.0.0.1licong read host ip linux 10.0.0.1 licong echo hostlinuxhostlinuxhost linux echo ip10.0.0.1licongip10.0.0.1licongip 10.0.0.1 licong 当我们输入的字段比变量数目多时,最后一个变量的值将不只一个字段,而是所有剩余的内容;当输入字段比变量数少时,多余的变量将是空值,你可以自己试试。现在我们再来看 while read line do … done < file read通过输入重定向,把file的第一行所有的内容赋值给变量line,循环体内的命令一般包含对变量line的处理;然后循环处理file的第二行、第三行。。。一直到file的最后一行。还记得while根据其后的命令退出状态来判断是否执行循环体吗?是的,read命令也有退出状态,当它从文件file中读到内容时,退出状态为0,循环继续惊醒;当read从文件中读完最后一行后,下次便没有内容可读了,此时read的退出状态为非0,所以循环才会退出。 另一种也很常见的用法: command | while read line do … done 如果你还记得管道的用法,这个结构应该不难理解吧。command命令的输出作为read循环的输入,这种结构长用于处理超过一行的输出,当然awk也很擅长做这种事
知识浅谈
2020/03/24
1.7K0
超牛逼!100 个开箱即用的 Shell 脚本,拿好了~
shell脚本是帮助程序员和系统管理员完成费时费力的枯燥工作的利器,是与计算机交互并管理文件和系统操作的有效方式。区区几行代码,就可以让计算机接近按照你的意图行事。
民工哥
2021/05/11
1.7K0
【Linux】While循环吃hang行了?(图是一个毒)
最近被一首歌曲洗脑了:心火烧,原名《情伴》,作为新中国第一首流行歌曲,绝对是神曲的鼻祖呀,而在向往的生活中被宋丹丹老师、黄磊老师等演艺之后每天哼哼到无法自拔😝 进入正题 这两天因为测试准备了一个脚本,流程就是类似要登录各个server然后执行命令,从设计来说感觉蛮简单的: 把各server的IP全部写入到一个文件,while循环读取每一行的IP通过ssh登录并执行命令之后继续下一个,设想的最初代码如下: 初始代码 #!/bin/bash -f if [ -z $1 ];then {
琉璃康康
2022/04/19
9530
【Linux】While循环吃hang行了?(图是一个毒)
linux按行读取 (while read line与for-loop)
在linux下一般用while read line与for循环按行读取文件。现有如下test.txt文件:
生信编程日常
2020/07/03
10K0
超实用!18 个开箱即用的 Shell 脚本,拿好了~
假设服务器环境为 lnmp,近期访问经常出现 502 现象,且 502 错误在重启 php-fpm 服务后消失,因此需要编写监控脚本,一旦出现 502,则自动重启 php-fpm 服务。
PHP开发工程师
2021/05/10
7140
超实用!18 个开箱即用的 Shell 脚本,拿好了~
Shell流程控制
test-commands 既可以是 test 测试或[]、[[]]测试,也可以是任何其它命令,test-commands 用于条件测试,它只判断命令的退出状态码是否为 0,为 0 则为 true。
入门笔记
2021/01/07
1K0
Shell逐行读取文件的4种方法
在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法。为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率。
用户1685462
2021/08/30
1.6K0
第三十章 : 流程控制:while/until 循环
In the previous chapter, we developed a menu-driven program to produce various kindsof system information. The program works, but it still has a significant usabilityproblem. It only executes a single choice and then terminates. Even worse, if an invalidselection is made, the program terminates with an error, without giving the user anopportunity to try again. It would be better if we could somehow construct the programso that it could repeat the menu display and selection over and over, until the userchooses to exit the program.
砖业洋__
2023/05/06
4620
0x8 Python教程:Whois自动化
本教程将演示一些功夫与Team Cymru的Python whois模块。在infosec中的攻击和防御角色中,你需要做很多whois查看,这个python模块可以节省你的时间。让我们跳进去开始玩这个模块的功能。
重生信息安全
2020/04/26
8770
一文简述shell流程控制
大家好呀!今天简单聊一聊Shell的流程控制。任何一门编程语言的学习,在了解了其基本的语法规则和变量外,都是从基础的流程控制语句开始学习。流程控制无非是顺序、分支(选择)加上循环,对于任何一门编程语言而言都是类似的。
reload
2024/08/18
2630
一文简述shell流程控制
08·Shell编程-循环
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
3910
Shell编程-while循环
作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2024/11/01
2520
Shell编程-while循环
shell中的for循环用法详解
例:输出0-9以内的随机数–》echo ((RANDOM%10)) 输出1-10以内的随机数–》echo ((RANDOM%10+1))
全栈程序员站长
2022/09/15
2.6K0
shell中的for循环用法详解
Linux Shell脚本面试25问
Q:1 Shell脚本是什么、它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(
小小科
2018/05/04
1.6K0
shell循环语句
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163938.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/15
7410
shell循环语句
Linux
shell脚本可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复用。 AC Terminal中的命令行可以看成是一个“shell脚本在逐行执行”。
她的店里只卖樱花
2022/10/31
2.8K0
《Linux命令行与shell脚本编程大全》第十五章 呈现数据
15.1 理解输入和输出 现在知道两种显示脚本输出的方法 1)在显示器屏幕上显示 2)将输出文件重定向到文件中 15.1.1 标准文件描述符 Linux系统将每个对象当做文件处理。这包括输入和数出进程。 Linux用文件描述符来标识每个文件对象。 它是一个非负整数,可以唯一标识会话中打开的文件。 每个进程一次最多可以有九个文件描述符 bash shell保留的前3个文件描述符(0、 1、 2) 1.STDIN 标准输入(0) STDIN文件代表shell的标准输入。 对终端界面来说,标准输入是键盘。 she
xcywt
2018/01/11
1.5K0
《Linux命令行与shell脚本编程大全》第十五章 呈现数据
read命令
read命令被用来从标准输入读取单行数据,这个命令可以用来读取键盘输入,当使用重定向以及默认选项的情况下,可以读取文件中的一行数据,此时read会将换行符视为行尾,但是可以使用-d选项更改。
WindRunnerMax
2020/10/26
1.2K0
相关推荐
Linux shell脚本使用while循环执行ssh的注意事项
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验