루프는 반복되어 결과를 한 줄로 인쇄합니다.

루프는 반복되어 결과를 한 줄로 인쇄합니다.

이 스크립트를 작성하려고 합니다.

#!/bin/bash

libexec="/usr/local/nagios/libexec"
#hostname=$1
hostname="hostname1 hostname2 hostname3 hostname4 hostname5 hostname6"
nagios_ok=0
nagios_warning=1
nagios_critical=2
nagios_unknown=3

#if [[ $hostname == "" ]]; then
#  echo "please enter a host to check"
#  exit $nagios_unknown
#fi

for host in $hostname;
do
output=$(curl -s -i -H 'accept: application/json' -H 'x-xxx-webservice-client-id: apimonitoring' "http://$host/v4/catalog/category/5545" -H 'Host:api-local.dal.xxx.com' | grep "HTTP/1.1" | awk '{print $2}')

if [[ $output == "200" ]]; then
echo "STATUS: OK HTTP Response $output for $host"
#    exit $nagios_ok (with the appropriate exit $nagios_ok)
else
echo  "STATUS: NOT OK HTTP Response $output for $host"
#    exit $nagios_critical (with appropriate exit $nagios_critical)
fi
done

출력이 정말 마음에 들지 않습니다.

STATUS: OK HTTP Response 200 for 10.xx.xx.xx
STATUS: OK HTTP Response 200 for 10.xx.xx.xx
STATUS: OK HTTP Response 200 for 10.xx.xx.xx
STATUS: NOT OK HTTP Response for 10.xx.xx.xx
STATUS: OK HTTP Response 200 for 10.xx.xx.xx
STATUS: NOT OK HTTP Response for 10.xx.xx.xx

나는 이런 것을 원한다

STATUS: OK HTTP Response 200 for 10.xx.xx.xx, 10.xx.xx.xx, 10.xx.xx.xx, etc ..
STATUS: NOT OK HTTP Response 404 for 10.xx.xx.xx, 10.xx.xx.xx, 10.xx.xx.xx, etc..

당신의 도움을 주셔서 대단히 감사합니다

답변1

Bash에서 배열을 사용하면 코드를 더 쉽게 읽고 유지 관리할 수 있습니다.

#!/bin/bash

libexec="/usr/local/nagios/libexec"

# for command line arguments:
hostnames=("$@")

# or to hardcode them:
hostnames=(hostname1 hostname2 hostname3 hostname4 hostname5 hostname6)

nagios_ok=0
nagios_warning=1
nagios_critical=2
nagios_unknown=3

curl_opts=(
    --silent
    --head
    --output /dev/null
    --write-out '%{http_code}'
    --header 'accept: application/json'
    --header 'x-xxx-webservice-client-id: apimonitoring'
    --header 'Host:api-local.dal.xxx.com'
)

# an associative array
declare -A host_codes

for host in "${hostnames[@]}"; do
    code=$(curl "${curl_opts[@]}" "http://$host/v4/catalog/category/5545")
    host_codes["$code"]+="$host, "
done

for code in "${!host_codes[@]}"; do
    [[ $code == 2* ]] && ok="OK" || ok="NOT OK"
    echo "STATUS: $ok HTTP Response $code for ${host_codes["$code"]%, }"
done

종료 상태를 설정하려면 다음을 수행할 수 있습니다.

status=$nagios_ok
for code in "${!host_codes[@]}"; do
    case $code in
    2*) ok="OK" ;;
    *)  ok="NOT OK"; status=$nagios_critical ;;
    esac
    echo "STATUS: $ok HTTP Response $code for ${host_codes["$code"]%, }"
done
exit $status

관련 정보