我如何 readably/tersely/correctly 检查一个值是否在两个范围之一内?
How can I readably/tersely/correctly check in whether a value is in one of two ranges?
我需要帮助为以下逻辑编写更好的代码:
if [[ "$CONDITION1" == "BAD" && "$PERCENT1" -ge 10 && "$PERCENT1" -le 30 ]] || [[ "$CONDITION1" == "GOOD" && "$PERCENT1" -ge 30 && "$PERCENT1" -le 60 ]] || [[ "$CONDITION2" == "BAD" && "$PERCENT2" -ge 10 && "$PERCENT2" -le 30 ]] || [[ "$CONDITION2" == "GOOD" && "$PERCENT2" -ge 30 && "$PERCENT2" -le 60 ]];
then
echo "RESULT 1"
elif [[ "$CONDITION1" == "BAD" && "$PERCENT1" -gt 30 ]] || [[ "$CONDITION1" == "GOOD" && "$PERCENT1" -gt 60 && "$PERCENT1" -le 100 ]] || [[ "$CONDITION2" == "BAD" && "$PERCENT2" -gt 30 ]] || [[ "$CONDITION2" == "GOOD" && "$PERCENT2" -gt 60 && "$PERCENT2" -le 100 ]];
then
echo "RESULT 2"
else
echo "RESULT 3"
fi
这是条件的基础:
结果 1:
如果 CONDITION1=BAD
,则 PERCENT1 为 10-30%
OR PERCENT1 is 30-60% if CONDITION1=GOOD
OR PERCENT2 is 10-30% if CONDITION2=BAD
OR PERCENT2 is 30-60% if CONDITION2=GOOD
结果 2:
PERCENT1>30% 如果 CONDITION1=BAD
OR PERCENT1 is 60-100% if CONDITION1=GOOD
OR PERCENT2>30% if CONDITION2=BAD
OR PERCENT2 is 60-100% if CONDITION2=GOOD
结果 2 覆盖结果 1。例如:
PERCENT1 is 10-30% and CONDITION1=BAD AND
PERCENT2>30% and CONDITION2=BAD will result in RESULT 1.
你不能把它清理得太多,但它可以做得更好。由于您需要结果 2 覆盖结果一,因此您需要两个 if 语句,第二个覆盖 运行。从技术上讲,你可以用一个 elif 来实现,override 是 if,下一个是 elif,但是这种逻辑更难阅读,而且当你的需求的复杂性会产生很长的条件时。
RESULT=3 # default to result 3
if [[ $PERCENT1 -ge 10 && $PERCENT1 -le 30 && $CONDITION1 = "BAD" ]]; then
RESULT=1
elif [[ $PERCENT1 -ge 30 && $PERCENT1 -le 60 && $CONDITION1 = "GOOD" ]]; then
RESULT=1
elif [[ $PERCENT2 -ge 10 && $PERCENT2 -le 30 && $CONDITION1 = "BAD" ]]; then
RESULT=1
elif [[ $PERCENT2 -ge 30 && $PERCENT2 -le 60 && $CONDITION2 = "GOOD" ]]; then
RESULT=1
fi
# RESULT 2 should override result one
if [[ $PERCENT1 -gt 30 && $CONDITION1 = "BAD" ]]; then
RESULT=2
elif [[ $PERCENT1 -ge 60 && $PERCENT1 -le 100 && $CONDITION1 = "GOOD" ]]; then
RESULT=2
elif [[ $PERCENT2 -gt 30 && $CONDITION1 = "BAD" ]]; then
RESULT=2
elif [[ $PERCENT2 -ge 60 && $PERCENT2 -le 100 && $CONDITION1 = "GOOD" ]]; then
RESULT=2
fi
echo "RESULT $RESULT" # output our result
由于命中 RESULT 1 或 RESULT 2 的次数无关紧要,因此 elif 可以正常工作。请注意,我将您的 -ge 30
更改为 -gt 30
,因为您在对条件的解释中使用了 > 30 而不是 >= 30。不知道哪一个打错了。
我需要帮助为以下逻辑编写更好的代码:
if [[ "$CONDITION1" == "BAD" && "$PERCENT1" -ge 10 && "$PERCENT1" -le 30 ]] || [[ "$CONDITION1" == "GOOD" && "$PERCENT1" -ge 30 && "$PERCENT1" -le 60 ]] || [[ "$CONDITION2" == "BAD" && "$PERCENT2" -ge 10 && "$PERCENT2" -le 30 ]] || [[ "$CONDITION2" == "GOOD" && "$PERCENT2" -ge 30 && "$PERCENT2" -le 60 ]];
then
echo "RESULT 1"
elif [[ "$CONDITION1" == "BAD" && "$PERCENT1" -gt 30 ]] || [[ "$CONDITION1" == "GOOD" && "$PERCENT1" -gt 60 && "$PERCENT1" -le 100 ]] || [[ "$CONDITION2" == "BAD" && "$PERCENT2" -gt 30 ]] || [[ "$CONDITION2" == "GOOD" && "$PERCENT2" -gt 60 && "$PERCENT2" -le 100 ]];
then
echo "RESULT 2"
else
echo "RESULT 3"
fi
这是条件的基础:
结果 1: 如果 CONDITION1=BAD
,则 PERCENT1 为 10-30%OR PERCENT1 is 30-60% if CONDITION1=GOOD
OR PERCENT2 is 10-30% if CONDITION2=BAD
OR PERCENT2 is 30-60% if CONDITION2=GOOD
结果 2: PERCENT1>30% 如果 CONDITION1=BAD
OR PERCENT1 is 60-100% if CONDITION1=GOOD
OR PERCENT2>30% if CONDITION2=BAD
OR PERCENT2 is 60-100% if CONDITION2=GOOD
结果 2 覆盖结果 1。例如:
PERCENT1 is 10-30% and CONDITION1=BAD AND
PERCENT2>30% and CONDITION2=BAD will result in RESULT 1.
你不能把它清理得太多,但它可以做得更好。由于您需要结果 2 覆盖结果一,因此您需要两个 if 语句,第二个覆盖 运行。从技术上讲,你可以用一个 elif 来实现,override 是 if,下一个是 elif,但是这种逻辑更难阅读,而且当你的需求的复杂性会产生很长的条件时。
RESULT=3 # default to result 3
if [[ $PERCENT1 -ge 10 && $PERCENT1 -le 30 && $CONDITION1 = "BAD" ]]; then
RESULT=1
elif [[ $PERCENT1 -ge 30 && $PERCENT1 -le 60 && $CONDITION1 = "GOOD" ]]; then
RESULT=1
elif [[ $PERCENT2 -ge 10 && $PERCENT2 -le 30 && $CONDITION1 = "BAD" ]]; then
RESULT=1
elif [[ $PERCENT2 -ge 30 && $PERCENT2 -le 60 && $CONDITION2 = "GOOD" ]]; then
RESULT=1
fi
# RESULT 2 should override result one
if [[ $PERCENT1 -gt 30 && $CONDITION1 = "BAD" ]]; then
RESULT=2
elif [[ $PERCENT1 -ge 60 && $PERCENT1 -le 100 && $CONDITION1 = "GOOD" ]]; then
RESULT=2
elif [[ $PERCENT2 -gt 30 && $CONDITION1 = "BAD" ]]; then
RESULT=2
elif [[ $PERCENT2 -ge 60 && $PERCENT2 -le 100 && $CONDITION1 = "GOOD" ]]; then
RESULT=2
fi
echo "RESULT $RESULT" # output our result
由于命中 RESULT 1 或 RESULT 2 的次数无关紧要,因此 elif 可以正常工作。请注意,我将您的 -ge 30
更改为 -gt 30
,因为您在对条件的解释中使用了 > 30 而不是 >= 30。不知道哪一个打错了。