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

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

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

#/bin/bash

IPS="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"
echo "====while test ===="

i=0

echo $IPS | while read line

do

    echo $(($i+1))

    echo $line

done

echo "====for test ===="

n=0

for ip in $IPS ;

do

   n=$(($n+1))

   echo $ip

   echo $n

done

输出结果如下:

====while test ====

1

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

====for test ====

10.1.1.10

1

3001

2

10.1.1.10

3

3003

4

10.1.1.11

5

3001

6

10.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 的输入重定向输入。

时间: 2024-10-29 19:30:43

【shell】while read line 与for循环的区别的相关文章

Shell中的for和while循环详细总结

  这篇文章主要介绍了Shell中的for和while循环详细总结,本文讲解了for循环的数字段形式.详细列出.对文件进行循环,while循环的三种使用场合等内容,需要的朋友可以参考下 一.for循环 1.数字段形式 代码如下: for i in {1..10} do echo $i done 2.详细列出(字符且项数不多)     代码如下: for File in 1 2 3 4 5 do echo $File done 3.对存在的文件进行循环 复制代码 代码如下: for shname

Shell脚本的条件控制和循环语句_linux shell

条件判断:if语句 语法格式: if [ expression ] then Statement(s) to be executed if expression is true fi 注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误. if 语句通过关系运算符判断表达式的真假来决定执行哪个分支.Shell 有三种 if ... else 语句: if ... fi 语句 if ... else ... fi 语句 if ... elif ... else ... f

java中两个for循环的区别

问题描述 java中一直在用for循环,但一直没弄清两个for循环的区别,今天看到个小列子,才恍然大悟publicclassTest{publicstaticvoidmain(String[]args){Randomrandom=newRandom(47);String[]strArray=newString[random.nextInt(20)];for(Strings:strArray){s="5555";}System.out.println("第一个for循环的结果是

增强for循环与普通for循环的区别2

1,增强for循环与普通for循环的区别: 增强for循环必须有被遍历的目标(如集合或数组). 普通for循环遍历数组的时候需要索引. 增强for循环不能获取下标,所以遍历数组时最好使用普通for循环. 2,特点: 书写简洁. 对集合进行遍历,只能获取集合元素,不能对集合进行操作,类似迭代器的简写形式,但是迭代器可以对元素进行remove操作(ListIterator可以进行增删改查的操作). 3,书写格式: for(数据类型变量名 : 被遍历的集合(collection)或者数组) { 执行语

C# while与for 循环语句区别

c# while与for 循环语句区别 while 语句执行一个语句或语句块,直到指定的表达式计算为 false. // statements_while.cs using system; class whiletest {     static void main()     {         int n = 1;         while (n < 6)         {             console.writeline("current value of n is {

Shell中的for和while循环详细总结_linux shell

一.for循环 1.数字段形式 复制代码 代码如下: for i in {1..10} do    echo $i done 2.详细列出(字符且项数不多) 复制代码 代码如下: for File in 1 2 3 4 5 do     echo $File done 3.对存在的文件进行循环 复制代码 代码如下: for shname in `ls *.sh` do           name=`echo "$shname" | awk -F. '{print $1}'`     

Linux下Shell脚本中几种基本命令的替换区别_linux shell

Part 1 : ` command ` 这是 "命令标准输出作为函数标准输入" 操作方法之一,有很大的弊端以及不安全的地方. 缺点一:比较陈旧. 缺点二:容易与单引号混淆.(其实它是你键盘"!"左边那个键) Part 1.5 ` command``与 $(command) 俩者区别 直接看几张图吧,看这图解释他们区别... 大家可以看到俩种表达方式,分别是代表命令直接执行和嵌套执行. 我们发现:执行`` 和 $() 是相同的. 附,其实这里有个小bug...( 橙

Linux shell脚本基础学习详细介绍(完整版)

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Linux 脚本编写基础 ◆1.1 语法基本介绍1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可

unix-shell脚本执行异常,一直循环

问题描述 shell脚本执行异常,一直循环 脚本目的,分析脚本执行结果,将有问题的项目附加到结果后面. #!/bin/bash function analyse_report() { abnormal_item=$1 IP=$2 case "$abnormal_item" in 3) echo "hostname of $IP">>Linux_1410221605.txt cat ../result/1410231618/result_192.168.5