首页 > 解决方案 > Bash 函数在 if ... 中返回值;然后声明

问题描述

我正在启用虚拟机上的防火墙。最初,防火墙处于屏蔽状态。我使用两个功能

function status_firewall() {
  RET_VAL=" "
  STATUS=$(systemctl status firewalld)
  MASKED=$(grep -e "masked" <<< $STATUS)
  M_RET=$?

  DEAD=$(grep -e "dead" <<< $STATUS)
  D_RET=$?
  logging "M_RET and D_RET: $M_RET, $D_RET"
  if [ "${M_RET}" -eq "0" ]; then
    RET_VAL=1
  elif [ "${D_RET}" -eq "0" ]; then
    RET_VAL=2
  else
    RET_VAL=0
  fi
  echo ${RET_VAL}
}

如果防火墙被屏蔽,则 echo 语句打印值“1”

function check_firewall() {
  FIREWALL=$(status_firewall)
  logging "Firewall status in check_firewall: ${FIREWALL}"
  if [ "$(status_firewall)" -eq "0" ]; then
    logging "Firewalld service already running"
    RET_VAL=0
  elif [ "$(status_firewall)" -eq "1" ]; then
     ...
  elif
     ...
  fi

我得到了正确的 MASKED 和 DEAD 状态值 (0, 0) status_firewall() { ... } 但是,当检查 check_firewall() { .. } 中的返回值时,我得到以下整数错误:整数表达式预期

检查返回值时:check_firewall() 它列出: 防火墙状态: ● firewalld.service 已加载:屏蔽 (/dev/null) 活动:非活动(死)

为什么第一个函数应该返回值“1”但在第二个函数中它将返回值列为命令的输出:systemctl status firewalld

标签: bashfunctionconditional-statements

解决方案


首先,status_firewall通过使用返回值而不是写入标准输出来简化,并在case语句中使用模式匹配而不是调用grep.

status_firewall() {
    status=$(systemctl status firewalld)
    case $status in
        *masked*) rv=1 ;;
        *dead*)   rv=2 ;;
        *) rv=0 ;;
    esac
    return $rv
}

然后 check_firewall只是检查退出状态的问题status_firewall

check_firewall() {
  status_firewall
  case $? in
    0) logging "Firewalld service already running" ;;
    1) ... ;;
    2) ... ;;
  esac
}

实际上,您可以status_firewall完全取消:

check_firewall() {
  case $(systemctl status firewalld) in
    *masked*) ... ;;
    *dead*) ... ;;
    *) logging "Firewalld service already running" ;;
  esac
}

推荐阅读