我一直有一个让我撕掉头发的问题。我确信答案很简单,但到目前为止它已经回避了我。从逻辑上讲,这就是我想要做的事情:
检查特定类型安装的文件系统
对这些安装运行命令以获得上/下状态
如果状态为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
答案 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/.*\///')