gpt4 book ai didi

linux - Bash 在 for 循环中的 if 语句中退出

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:54 27 4
gpt4 key购买 nike

我正在尝试在 Bash 中执行 for 循环并在 if 语句上退出,但我意识到它会在完成循环之前破坏代码。

#!/bin/bash

for node in $(ps -ef | awk <something>);
do

var=<command>
echo "node ${node}"

if [[ ${var} -gt 300000 ]]; then
echo "WARNING!";
exit 1;

elif [[ ${var} -gt 1000000 ]]; then
echo "CRITICAL!";
exit 2;

else
echo "OK!";
exit 0;
fi
done

我的第二个选择是在循环外部设置一个变量而不是exit,但后来我意识到它将覆盖每个节点状态:

#!/bin/bash

for node in $(ps -ef | awk <command>);
do

var=<command>
echo "node ${node}"

if [[ ${var} -gt 300000 ]]; then
echo "WARNING!";
status="warning"

elif [[ ${var} -gt 1000000 ]]; then
echo "CRITICAL!";
status="critical"

else
echo "OK!";
status="ok"
fi
done

if [[ status == "warning" ]]; then
exit 1;
elif [[ status == "critical" ]]; then
exit 2;
elif [[ status == "ok" ]]; then
exit 0;
fi

如何在每个节点上正确退出?

最佳答案

这是一个替代方案。它对结果进行计数,并根据计数器创建退出状态。我更改了语义,因为您的脚本永远不会到达关键路径。相反,为 >1000000 的值输入警告路径:

#!/bin/bash

let ok_count=0 warn_count=0 critical_count=0

for node in $(ps -ef | awk <command>);
do

var=<command>
echo "node ${node}"

# >1000000 must be checked before >300000
if [[ ${var} -gt 1000000 ]]; then
echo "CRITICAL!";
let critical_count++

elif [[ ${var} -gt 300000 ]]; then
echo "WARNING!";
let warn_count++

else
echo "OK!";
let ok_count++
fi
done

if ((critical_count)); then
exit 2
elif ((warn_count)); then
exit 1
else
exit 0
fi

如果只需要退出状态,则可以优化此脚本:CRITICAL 是最高警告级别。所以计数是没有必要的。好的是后备。所以计数是没有必要的。

#!/bin/bash

let warn_count=0

for node in $(ps -ef | awk <command>);
do

var=<command>
echo "node ${node}"

if [[ ${var} -gt 1000000 ]]; then
echo "CRITICAL! -> abort";
exit 2 # no more analysis needed!

elif [[ ${var} -gt 300000 ]]; then
echo "WARNING!";
let warn_count++
fi
done

exit $(( warn_count > 0 ))

关于linux - Bash 在 for 循环中的 if 语句中退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60315543/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com