变量在while循环中重置为NULL

时间:2013-04-22 20:19:06

标签: bash

我一直有一个让我撕掉头发的问题。我确信答案很简单,但到目前为止它已经回避了我。从逻辑上讲,这就是我想要做的事情:

检查特定类型安装的文件系统
对这些安装运行命令以获得上/下状态
如果状态为up,请检查日志文件的1000行以获取字符串“slow response”
如果找到,将flag设置为1并退出循环
如果没有,将flag设置为0并获得下一行直到完成
如果状态为down,则将标志设置为0并继续移动
echo $ flag

不幸的是,这个脚本只返回NULL。我发现这很奇怪,因为当我在赋值后立即插入echo $标志时,它将回显正确的输出。此代码中的某处被重置为NULL,我无法找到它。有什么想法吗?作为附加信息,我已经检查过以确保$ status,$ i和$ line的值如果我在分配后插入echo语句则显示正确的输出。

#!/bin/bash
LOGDIR=/var/log/ceph/

df|grep osd|sed 's/.*\///'|while read i;do
   status=`ceph osd dump|grep -w "$i"|awk '{print $2}'`
   if [ $status == "up" ]; then
      tail -1000 $LOGDIR/ceph-$i.log|while read line;do
          if echo $line|grep -q "slow response";then
             let flag=1
             break
          else
             let flag=0
             continue
          fi
       done
elif [ $status == "down" ];then
       let flag=0
    fi
    echo $flag
done

2 个答案:

答案 0 :(得分:3)

这看起来像Bash FAQ,特别是E4)如果我将命令的输出传递给read variable,为什么当read命令完成时输出不显示在$ variable中?

从技术上讲,管道和循环是在子shell中创建的,和Unix中的任何程序一样,环境会被传递下去,但环境中的变化永远不会被传递。

答案 1 :(得分:0)

see this for a full explanation

while read i;
  do something;
done < <(df|grep osd|sed 's/.*\///')