【问题标题】:Bash Function return values in if ...; then statementBash 函数在 if ... 中返回值;然后声明
【发布时间】:2019-09-13 23:02:17
【问题描述】:

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

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

【问题讨论】:

  • 不要一直调用函数,使用$FIREWALL
  • logging 是做什么的?
  • 你的函数都不使用返回值。他们只是写到标准输出。
  • 更改脚本以使用返回码。 return 0 成功,然后只是 if status_firewall; then ...
  • -eq 比较两个整数。 = 比较两个字符串。

标签: bash function conditional-statements


【解决方案1】:

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

【讨论】:

  • 感谢您提供详细信息。这是一些非常好的代码。告诉我我还有很长的路要走
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2018-05-15
  • 2013-06-24
  • 1970-01-01
  • 2013-03-16
  • 2014-02-25
  • 2010-11-29
相关资源
最近更新 更多