bash-скрипт для выравнивания текста

Для нескольких И используйте

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
0
27.02.2020, 18:40
2 ответа

Ваш сценарий работает не так, как вы думаете.

Сначала вы должны использовать 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

1
28.04.2021, 23:21

Если вам не нужно сохранять :в окончательном выводе, тогда

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 для ширины, но если массив служб изменится, вы можете перебрать массив и вычислить самую длинную.

2
28.04.2021, 23:21

Теги

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