1

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

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

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

#!/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
4

2 回答 2

3

这看起来像一个Bash FAQ,尤其是 E4)如果我将命令的输出通过管道传输到read variable,为什么在读取命令完成时输出不显示在 $variable 中?

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

于 2013-04-22T20:24:45.243 回答
0

看到这个以获得完整的解释

while read i;
  do something;
done < <(df|grep osd|sed 's/.*\///')
于 2013-04-22T20:28:51.603 回答