Bash: Looping através de uma string

1

Eu tenho uma variável Vmac que armazena valores de vários endereços MAC, coletados de wmic chamada da seguinte forma:

Vmac='wmic --delimiter="," --authentication-file=/path/to/file //IP-ADDR "Select AdapterType,MACAddress from Win32_NetworkAdapter" | grep "Ethernet" | awk -F, '{print $3}'| sort | uniq | tr '\n' ' ''

Foi observado que, o número de valores contidos na variável Vmac varia no intervalo de 1 a 5, para hosts diferentes. Eu tenho que separar cada um deles e armazená-los em uma variável VmacN , onde N pode ter valores de 1 a 5.

Para alguns hosts, pode haver apenas um endereço MAC, por isso, teria apenas Vmac1 disponível. Considerando que, host com 4 NICs (e, portanto, endereços MAC) teria Vmac1 , Vmac2 , Vmac3 e Vmac4 .

Para tabularizar essa informação eficientemente, eu também preciso armazenar o valor NA nas variáveis VmacN , onde menos endereços MAC estão disponíveis (por exemplo, para máquina com 1 NIC, Vmac1 será AA:BB:CC:DD , enquanto Vmac2 a Vmac5 será NA . Enquanto na máquina com 4 NICs, somente Vmac5 será NA ).

Para isso, criei e testei um trecho de código, que é o seguinte:

if [ ! -z "$Vmac" ]
then
        i=1
       for mac in $Vmac
        do
             declare "Vmac${i}"="$mac"
                ((i++))
        done
fi
printf "${Vmac1:-NA}"",""${Vmac2:-NA}"",""${Vmac3:-NA}"

Saída:

3C:40:20:52:41:53 88:51:FB:3F:0D:81 C8:CB:B8:CC:5F:D2,NA,NA

Quando impressa apenas Vmac1 , imprimirá endereços MAC inteiros (ou seja, valor de Vmac ).

Suponho que estou errado em iterar Vmac .

Como fazer uma iteração através de uma variável que contém um valor de string?

    
por Mandar Shinde 13.03.2015 / 13:13

1 resposta

4

Use apenas uma matriz. Por exemplo:

## read the MACs into an array
declare -a Vmac=( $(wmic --delimiter="," --authentication-file=/path/to/file \
            //IP-ADDR "Select AdapterType,MACAddress from Win32_NetworkAdapter" | 
             grep "Ethernet" | awk -F, '{print $3}'| sort | uniq | tr '\n' ' ' )

## Add NAs as appropriate
for((i=0;i<6;i++)); do 
    [ -z "${Vmac[i]}" ] && Vmac[i]="NA" 
done

Para ilustrar:

#!/bin/bash
declare -a vmac=( $(echo 3C:40:20:52:41:53 88:51:FB:3F:0D:81 C8:CB:B8:CC:5F:D2))
for((i=0;i<6;i++)); do 
    [ -z "${vmac[i]}" ] && vmac[i]="NA" 
done
echo "${vmac[@]}"

Saída:

3C:40:20:52:41:53 88:51:FB:3F:0D:81 C8:CB:B8:CC:5F:D2 NA NA NA
    
por 13.03.2015 / 14:30