ループは繰り返され、結果を1行で印刷します。

ループは繰り返され、結果を1行で印刷します。

このスクリプトを作成しようとしています。

#!/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

関連情報