Написание сценария сборки с операторами if и вызовами функций

Идея состоит в том, чтобы построить шаблон grep, который более точно соответствует тому, что вы хотите. Помните, что .соответствует любому символу.

Так, например, BOX.Container_${name}_становится полезным шаблоном. Теперь Philipsотличается от Philips1. Где вы хотите объединить записи, вы можете искать ClockService.; который объединит ClockService1и ClockService2.

Мы также можем упростить некоторые тесты с помощью grep -cи использовать [B]OX, чтобы избежать требования grep -v.

Итоговый код выглядит примерно так:

declare -A procs=(
[Philips]=1
[Node.]=1 
[Host.]=1 
[Server.]=1
[Philips1]=1
[Philips3]=1 
[ClockService.]=2)

# psout=$(ps -u user -f)
psout=$(cat psout)

for i in "${!procs[@]}"
do
  name=$i
  configured_count=${procs[$i]}

  running=$(echo "$psout" | grep -c "[B]OX.Container_${name}_")

  if [[ "$configured_count" -gt "$running" ]]; then
    result+=$(echo -e "\n[FAIL] ${name} - configured count: ${configured_count} running count: $running")
  elif [[ "$running" -gt "$configured_count" ]]; then
    result+=$(echo -e "\n[WARN] ${name} - configured count: ${configured_count} running count: $running")
  else
    result+=$(echo -e "\n[PASS] ${name} - configured count: ${configured_count} running count: $running")
  fi
done

echo "$result"

В этом примере я catпроверяю файл, а не вызываю ps, но вы можете увидеть, как это изменить.

% cat psout
BOX.Container_Philips1_Primary_X1
BOX.Container_Philips_Primary_X1
BOX.Container_Philips3_Primary_X1
BOX.Container_Server1_X1
BOX.Container_Node1_X1
BOX.Container_Host1_X1
BOX.Container_ClockService1_X1
BOX.Container_ClockService2_X1

% bash code

[PASS] Node. - configured count: 1 running count: 1
[PASS] ClockService. - configured count: 2 running count: 2
[PASS] Philips1 - configured count: 1 running count: 1
[PASS] Philips3 - configured count: 1 running count: 1
[PASS] Server. - configured count: 1 running count: 1
[PASS] Philips - configured count: 1 running count: 1
[PASS] Host. - configured count: 1 running count: 1
6
12.02.2020, 20:25
2 ответа

Да, как вы заметили, поскольку ваша функция всегда возвращает 0, она всегда будет возвращать успех. Неважно, что произойдет. Самое простое решение — вообще ничего не возвращать из вашей функции :

.
function clone {
    git clone /volume1/repos/project.git
    cd project
}

function build {
    docker build -t project.
}

Затем он вернет статус выхода последнего запуска команды (из man bash):

.

when executed, the exit status of a function is the exit status of the last command executed in the body.

Конечно, поскольку последней командой вашей функции cloneявляется cd, это означает, что если git cloneзавершится ошибкой, а cd projectзавершится успешно, ваша функция все равно вернет успех. Чтобы избежать этого, вы можете сохранить статус выхода команды git в переменной, а затем ваша функция вернет эту переменную :

.
function clone {
    git clone /volume1/repos/project.git
    out=$?
    cd project
    return $out
}

Или, может быть, лучше:

function clone {
    git clone /volume1/repos/project.git && cd project
}

Комбинируя команды, в случае сбоя любой из них ваша функция вернет ошибку.

13
28.04.2021, 23:23

Измените свои функции на что-то вроде:

function clone {
    if git clone /volume1/repos/project.git; then
            cd project
            return 0
    else
            return 1
    fi
}

function build {
    docker build -t project.
}

Таким образом, если команды внутри них завершатся неудачно, функция завершится корректно. Обратите внимание, что вам не нужно явно возвращать что-либо для функции build, так как она просто вернется со статусом выхода команды docker, однако, если вы добавите к ней больше команд, вам может потребоваться настроить ее аналогично cloneфункция.

4
28.04.2021, 23:23

Теги

Похожие вопросы