Bash выход в операторе if в цикле for - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь сделать для l oop в Bash и выйти из оператора if, но я понял, что он сломает код перед завершением l oop.

#!/bin/bash

for node in $(ps -ef | awk <something>);
do

  var=<command>
  echo "node ${node}"

  if [[ ${var} -gt 300000 ]]; then
    echo "WARNING!";
    exit 1;

  elif [[ ${var} -gt 1000000 ]]; then
    echo "CRITICAL!";
    exit 2;

  else
    echo "OK!";
    exit 0;
  fi
done

Мой второй вариант - установить переменную вместо exit вне l oop, но потом я понял, что она переопределит состояние каждого узла:

#!/bin/bash

for node in $(ps -ef | awk <command>);
do

  var=<command>
  echo "node ${node}"

  if [[ ${var} -gt 300000 ]]; then
    echo "WARNING!";
    status="warning"

  elif [[ ${var} -gt 1000000 ]]; then
    echo "CRITICAL!";
    status="critical"

  else
    echo "OK!";
    status="ok"
  fi
done

if [[ status == "warning" ]]; then 
  exit 1;
elif [[ status == "critical" ]]; then 
  exit 2;
elif [[ status == "ok" ]]; then 
  exit 0;
fi 

Как правильно выйти на каждом узле?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Вот альтернатива. Он подсчитывает результаты и создает состояние выхода в зависимости от счетчиков. Я изменил семанти c, потому что ваш сценарий никогда не достигает критического пути. Вместо этого был введен путь WARNING для значений> 1000000:

#!/bin/bash

let ok_count=0 warn_count=0 critical_count=0

for node in $(ps -ef | awk <command>);
do

  var=<command>
  echo "node ${node}"

  # >1000000 must be checked before >300000
  if [[ ${var} -gt 1000000 ]]; then
    echo "CRITICAL!";
    let critical_count++

  elif [[ ${var} -gt 300000 ]]; then
    echo "WARNING!";
    let warn_count++

  else
    echo "OK!";
    let ok_count++
  fi
done

if ((critical_count)); then 
  exit 2
elif ((warn_count)); then 
  exit 1
else
  exit 0
fi

Этот сценарий можно оптимизировать, если требуется только состояние выхода: CRITICAL - это самый высокий уровень предупреждения. Так что подсчет не нужен. ОК это запасной вариант. Так что подсчет не нужен.

#!/bin/bash

let warn_count=0

for node in $(ps -ef | awk <command>);
do

  var=<command>
  echo "node ${node}"

  if [[ ${var} -gt 1000000 ]]; then
    echo "CRITICAL! -> abort";
    exit 2 # no more analysis needed!

  elif [[ ${var} -gt 300000 ]]; then
    echo "WARNING!";
    let warn_count++
  fi
done

exit $(( warn_count > 0 ))
0 голосов
/ 20 февраля 2020

Используйте оператор continue от man bash

...
       continue [n]
              Resume the next iteration of the enclosing for, while, until, or select loop.  If n is specified, resume at the nth enclosing loop.  n must be
              ≥ 1.  If n is greater than the number of enclosing loops, the last enclosing loop (the ``top-level'' loop) is resumed.  The return value is  0
              unless n is not greater than or equal to 1.

или break, если вам необходимо выйти из l oop

...
       break [n]
              Exit  from within a for, while, until, or select loop.  If n is specified, break n levels.  n must be ≥ 1.  If n is greater than the number of
              enclosing loops, all enclosing loops are exited.  The return value is 0 unless n is not greater than or equal to 1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...