bash:多个if语句有更聪明的方法吗?

时间:2014-04-02 09:13:07

标签: bash if-statement

我使用多个if语句来查询CDR_Rate,如果它高于阈值则发送SNMP陷阱。如果是新陷阱,请创建警报标志(CDR_PUSH_A)&发送SNMP陷阱。 当脚本再次运行并且仍然超过阈值并且已经设置了标志。不要发送另一个陷阱。

如果阈值已清除且标志存在,请删除该标志并发送清除snmp陷阱。 如果没有越过阈值则什么都不做。

if [[ $CDR_PUSH -gt 100  &&  ! -e $DIR5/CDR_PUSH_A ]]; then
    touch $DIR5/CDR_PUSH_A;
    echo "Send Trap"
elif [[ $CDR_PUSH -lt 100 && -e $DIR5/CDR_PUSH_A ]]; then
    rm $DIR5/CDR_PUSH_A;
    echo "Clear Trap"
else
    echo "No Alert"
fi

上述脚本可根据需要运行。

只是想知道是否有更聪明的方法来执行相同的功能? 因为我必须为多个变量执行相同的命令。

由于

2 个答案:

答案 0 :(得分:1)

逻辑看起来没问题,将其包装在一个灵活的函数中

#
# $1 = CDR_rate
# $2 = threshold value
# $3 = flag file
#
check_thresh()
{
  if [[ $1 -gt $2 && ! -e $3 ]]; then
      touch -- "$3"
      echo "Send Trap"
  elif [[ $1 -le $2 && -e $3 ]]; then
      rm -- "$3"
      echo "Clear Trap"
  else
      echo "No Alert"
  fi
}

check_thresh "$CDR_PUSH" 100 "$DIR5/CDR_PUSH_A"
check_thresh "$something" 50 "$DIR6/something_Z"

答案 1 :(得分:1)

以较小的块分解您的代码,如下所示:

threshold_exceeded() {
  [[ $CDR_PUSH -gt 100 ]] 
}

clear_trap() {
  rm $DIR5/CDR_PUSH_A
  echo "Clear Trap"
}

send_trap() {
  touch $DIR5/CDR_PUSH_A
  echo "Send Trap"
}

was_trap_sent_before() {
  [[ -e $DIR5/CDR_PUSH_A ]]
}

check_for_alert() {
  if threshold_exceeded; then
    was_trap_sent_before || send_trap
    return
  fi

  if ! threshold_exceeded; then
    was_trap_sent_before && clear_trap
    return
  fi
}

然后,您可以使用事件名称阈值参数化check_for_alert()