Идея состоит в том, чтобы построить шаблон 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
Да, как вы заметили, поскольку ваша функция всегда возвращает 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
}
Комбинируя команды, в случае сбоя любой из них ваша функция вернет ошибку.
Измените свои функции на что-то вроде:
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
функция.