Linux bash iterating and Break

0

Eu tenho dois grupos de servidores, SERVERS_CA AND SERVERS_NY.

Eu terei uma matriz como SERVERGROUP = (CA NY)

CA e NY terão conjuntos de servidores em matrizes como

CA = (ca126 ca546 ca 642)

NY = (ny112 ny113 ny114)

O que meu script precisa fazer é verificar se o HOSTNAME do servidor no qual o script é executado corresponderá a qual grupo.

Suponha que o HOSTNAME do servidor esteja no array CA, então ele deve dizer algo como SERVERGROUP IS CALIFORNIA

para este script, o loop deve ter a instrução break e deve sair do loop uma vez que o grupo de servidores requerido não exceda todo o loop.

Se alguém pudesse me ajudar a escrever este roteiro, seria útil. Obrigado

    
por Jamesking 27.08.2014 / 22:13

1 resposta

1

matrizes de matrizes são realmente muito dolorosas no 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

O uso de matrizes associativas (bash versão 4) é outra abordagem:

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

Ou você pode criar um "mapa reverso"

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
    
por 27.08.2014 / 22:31