【问题标题】:Linux while read loopLinux while 读取循环
【发布时间】:2013-10-04 13:50:53
【问题描述】:

我有以下脚本:

#!/bin/bash

function doPing () {
    pings=0

    #cat /home/scripts/test.txt | while read server ; do
    #while [ $pings -le 3 ] ; do
        echo success1 $pings
        if [ 1 -eq 1 ]; then {
            pings=$(expr $pings + 1)
            echo success- $pings
        } else if [ 1 -eq 2 ]; then {
            pings=$(expr $pings + 1)
            echo not
        } else {
            pings=$(expr $pings + 1)
            echo known
        } fi
        fi

        echo success3 $pings
    done

    echo -e "\nSuccessfully pinged $pings.\n"
}

doPing

test.txt 包含几行服务器名称,其实没关系。

我的问题是,当我取消注释 #while ... 行时,我得到:

success1 0
success- 1
success3 1
success1 1
success- 2
success3 2
success1 2
success- 3
success3 3
success1 3
success- 4
success3 4
success1 4
success- 5
success3 5

Successfully pinged 0.

但是当我取消注释 #cat ... 行时,我得到:

success1 0
success- 1
success3 1
success1 1
success- 2
success3 2
success1 2
success- 3
success3 3
success1 3
success- 4
success3 4

Successfully pinged 4.

我怎样才能使#while 输出将被ping 一些数字,例如#cat ...,而不是零?请帮忙。谢谢。

【问题讨论】:

  • 这很挑剔(不是您的问题),但您可能需要将#!/bin/bash 调整为#!/usr/bin/env bash。这对其他系统更便携,因为它使用由环境变量指定的bash。就这个问题而言,我敢打赌有人会打败我,但我现在正在本地查看。

标签: linux bash loops


【解决方案1】:

问题是管道创建了一个子shell,并且对子shell中变量的更改不会传播到父级。

更多信息请阅读this explanation about variables in pipelines

【讨论】:

  • ...解决方法很简单:去掉cat的无用用法!不要使用管道,使用while ... done </home/scripts/test.txt
【解决方案2】:

这就是我所做的:

...
while read value ; do
...
done < /home/scripts/test.txt
...

……虽然我不知道-r后面的read是什么意思。

【讨论】:

  • 是的,但这有什么实际含义,这是我还没有得到的。会不会是那个文件看起来像一大行,即使实际上有不止一行?谢谢
猜你喜欢
  • 2013-07-08
  • 2011-03-05
  • 1970-01-01
  • 2017-12-09
  • 2018-04-17
  • 2015-01-04
  • 1970-01-01
  • 2020-03-26
  • 2018-09-05
相关资源
最近更新 更多