Bash函数返回值if ...;然后声明

时间:2019-04-24 15:24:17

标签: bash function conditional-statements

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

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状态防火墙d

1 个答案:

答案 0 :(得分:6)

首先,通过使用返回值而不是写入标准输出来简化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
}