Для нескольких И используйте
if [ condition ] && [ condition ] && [ condition ]
then
code
fi
Это работает и с ИЛИ (||
), например
if [ "$1" = "normal" ] || [ "$1" = "beta" ] || [ "$1" = "stable" ]
then
printf 'Site: %s\n' "$1"
else
echo 'Error, type parameter mode version: normal, beta, stable' >&2
exit 1
fi
В вашем случае вы также можете использовать:
case "$1" in
normal|beta|stable)
printf 'Site: %s\n' "$1" ;;
*)
echo 'error' >&2
exit 1
esac
Ваш сценарий работает не так, как вы думаете.
Сначала вы должны использовать pgrep
вместо ps -ef
, но если вы все же используете ps -ef
, вам нужноgrep -v grep
после выполнить grep для service
. Однако вам нужно искать s внутри цикла, иначе вы только один раз ищете первую службу и не ищете какие-либо другие.
Вы также должны использовать "${services[@]}"
вместо${services[*]}
Следующее должно работать правильно:
services=(
'MonTier-AppAdmin'
'MonTier-Derby'
'MonTier-es-raw-trans-Nodes-1'
'MonTier-es-raw-trans-Nodes-2'
'MonTier-es-raw-trans-Nodes-3'
'MonTier-es-raw-trans-Nodes-4'
'MonTier-SyslogAgent-1'
'MonTier-SyslogAgent-2'
'MonTier-SyslogAgent-3'
'MonTier-SyslogAgent-4'
'MonTier-WsmAgent-1'
'MonTier-WsmAgent-2'
'MonTier-WsmAgent-3'
'MonTier-WsmAgent-4'
'MonTier-HK-ESRetention'
'MonTier-HK-WdpDeviceResources'
'MonTier-HK-WdpServiceResources'
'MonTier-HK-SyslogKeepalive'
'MonTier-HK-WsmKeepalive'
'MonTier-UI'
'MonTier-Reports'
'MonTier-AgentNode'
'Kibana'
)
for s in "${services[@]}"; do
if pgrep -lf "$s" >/dev/null 2>&1; then
printf '%s status:?%b\n' "$s" '\033[0;92mup\e[0m'
else
printf '%s status:?%b\n' "$s" '\033[0;31mDOWN\e[0m'
fi
done | column -s? -t
Здесь мы печатаем ?
между status:
и up
/DOWN
, чтобы его можно было использовать в качестве разделителя полей дляcolumn
Если вам не нужно сохранять :
в окончательном выводе, тогда
column -t -s:
будет делать то, что вы хотите, хотя с escape-кодами это немного хрупко.
ИМХО, правильно использовать спецификатор ширины для printf. Это также устраняет ошибку, если какая-либо из служб однажды получит %
в имени.
Опираясь на то, что @jesse _b говорит о pgrep, цитировании и т. д., и используя одинарные кавычки везде, где это возможно
services=(
'MonTier-AppAdmin'
'MonTier-Derby'
'MonTier-es-raw-trans-Nodes-1'
'MonTier-es-raw-trans-Nodes-2'
'MonTier-es-raw-trans-Nodes-3'
'MonTier-es-raw-trans-Nodes-4'
'MonTier-SyslogAgent-1'
'MonTier-SyslogAgent-2'
'MonTier-SyslogAgent-3'
'MonTier-SyslogAgent-4'
'MonTier-WsmAgent-1'
'MonTier-WsmAgent-2'
'MonTier-WsmAgent-3'
'MonTier-WsmAgent-4'
'MonTier-HK-ESRetention'
'MonTier-HK-WdpDeviceResources'
'MonTier-HK-WdpServiceResources'
'MonTier-HK-SyslogKeepalive'
'MonTier-HK-WsmKeepalive'
'MonTier-UI'
'MonTier-Reports'
'MonTier-AgentNode'
'Kibana'
)
for s in "${services[@]}"; do
printf '%-42s ' "$s status:"
if pgrep "$s"; then
printf '\033[0;92mup\e[0m \n'
else
printf '\033[0;31mDOWN\e[0m \n'
fi
done
Здесь я жестко задал 42 для ширины, но если массив служб изменится, вы можете перебрать массив и вычислить самую длинную.