Функция Bash возвращает значения в if ...;тогда заявление - PullRequest
0 голосов
/ 24 апреля 2019

Я в процессе включения брандмауэра на виртуальной машине.Первоначально брандмауэр находится в маскированном состоянии.Я использую две функции

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

1 Ответ

6 голосов
/ 24 апреля 2019

Во-первых, упростите 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
}
...