У меня есть две группы серверов SERVERS_CA и SERVERS_NY.

У меня будет массив что-то вроде SERVERGROUP =(Калифорния, Нью-Йорк)

У CA и NY будет множество серверов в таких массивах, как

CA =(ca126 ca546 ca 642)

NY =(ny112 ny113 ny114)

Мой скрипт должен проверить, соответствует ли HOSTNAME сервера, с которого мы запускаем скрипт, какой группе.

Предположим, что HOSTNAME сервера находится в массиве CA, тогда должно быть что-то вроде SERVERGROUP IS CALIFORNIA

для этого сценария цикл должен иметь оператор break и должен выходить из цикла, как только будет обнаружена, что требуемая группа серверов не превышает весь цикл.

Если кто-то может помочь мне написать этот сценарий, это будет полезно. Спасибо

1 ответ1

1

массивы массивов действительно довольно болезненно в Bash

host=ny113
for grp in "${SERVERGROUP[@]}"; do 
    ref="${grp}[@]"
    for srv in "${!ref}"; do 
        if [[ $host == $srv ]]; then 
            echo $host is in $grp
            break 2
        fi
    done
done
ny113 is in NY

Использование ассоциативных массивов (bash version 4) - это еще один подход:

declare -A grps
grps[CA]="ca126 ca546 ca 642"
grps[NY]="ny112 ny113 ny114"

for grp in "${!grps[@]}"; do 
    # all quotes and spaces are very deliberate in next command
    if [[ " ${grps[$grp]} " == *" $host "* ]]; then
        echo $host is in $grp
        break
    fi
done

Или вы можете построить "обратную карту"

declare -A host2group
for grp in "${SERVERGROUP[@]}"; do 
    ref="${grp}[@]"
    for srv in "${!ref}"; do 
        host2group[$srv]=$grp
    done
done
echo $host is in ${host2group[$host]}
ny113 is in NY

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .