Para loop com uma matriz no script bash

0

Eu quero usar for loop com uma matriz. Eu usando o seguinte comando para isso:

#! /bin/bash
rm -f /orch/list

arrayVM=($(cat /orch/servers | grep $1 | awk '{print $1}'))
for i in $arrayVM
do
        echo ${arrayVM[$i]}>>list
done

Mas quando eu verifico o arquivo list , vejo apenas o primeiro elemento da matriz arrayVM . O que há de errado com o meu comando?

    
por Gefolge 09.08.2017 / 16:35

2 respostas

4

O erro principal é que for i in $arrayVM define i como o primeiro elemento em arrayVM , pois não há índice. Estou surpreso que isso não dê um erro no comando echo , a menos que o primeiro elemento da matriz seja numérico.

O que você precisa é da forma iterativa de for : -

for (( i=0; i<${#arrayVM[*]}; ++i ))
do
    echo ${arrayVM[$i]}>>list
done

No entanto, isso é desnecessariamente prolixo: muito mais simples é: -

for e in "${arrayVM[@]}"
do
    echo $e>>list
done

Isso atribui e a cada elemento, por sua vez, sem enumerá-los.

À luz da resposta de Fedorqui, se arrayVM não for necessário em outro lugar, então existe uma maneira muito mais simples de criar o arquivo de lista: -

cat /orch/servers | grep $1 | awk '{print $1}' >/orch/list

Ou, como o cat é desnecessário : -

grep $1 </orch/servers | awk '{print $1}' >/orch/list
    
por 09.08.2017 / 17:19
0

Se você não precisa que os dados sejam armazenados em uma matriz, mas também deseja usar todos os registros para outras coisas, é possível executar um loop normalmente pelos dados com um substituição de processos :

while IFS= read -r value _;
do
        echo "$value" >> list
done < <(grep "$1" /orch/servers)

Com read -r value _ , estamos armazenando o primeiro campo em $value e o restante na variável descartável $_ .

    
por 11.08.2017 / 10:34