Eu tenho 2 arrays para prcoess no script bash simultaneamente. O primeiro array contém tipos de rótulos. A segunda matriz contém valores, como em
LABELS=(label1 label2 label3 labe4 )
VALUES=(91 18 7 4)
O que é necessário é: um loop que ecoará o item indexado da matriz LABELS & e na frente desse valor correspondente para esse item da matriz VALUES, como em
label1 91
label2 18
label3 7
label4 4
Acho que o loop aninhado não funcionará, tentei abaixo, mas não funcionará pela sintaxe
for label in {LABELS[@]} && value in {VALUES[@]}
do
echo ${label} ${value}
done
Basta usar um índice numérico e referenciar os elementos da matriz por seu índice:
Ou, se você estiver usando um bash relativamente recente (>= versão 4) ou outro shell que suporte arrays associativos, basta usar um único array:
Mudei seus nomes de variáveis para letras minúsculas porque é uma prática ruim usar CAPS para variáveis locais em scripts de shell, pois as variáveis de ambiente globais são capitalizadas por convenção, portanto, usar caps em seus scripts pode levar a colisões de nomes de variáveis.
Como ambos os seus arrays têm exatamente os mesmos índices (0, 1, 2 e 3), você pode usar
${!array[@]}
para iterar sobre os índices (chaves AKA) de um dos arrays e usar esse iterador para acessar os valores em ambos os arrays.Isso funciona com "matrizes indexadas" (ou seja, com índices inteiros) e "matrizes associativas" (índices de string).
por exemplo
Resultado:
BTW, você também pode usar um loop como este para preencher um array associativo, o que pode ser útil em situações em que você não pode apenas ler a chave e o valor ao mesmo tempo, como com seus dois arrays definidos manualmente:
Resultado:
A partir de agora, seu script pode usar array associativo
$LV
para acessar diretamente o valor da chave, por exemploVocê também pode usar um loop for no estilo C como nas respostas de @terdon e @NickMatteo (loop de 0 ao comprimento do array), mas isso só funciona se os índices do array forem numéricos e consecutivos sem lacunas (índices indefinidos) no array .
Em muitos/na maioria dos casos, isso é bom porque as matrizes geralmente são definidas com números de índice consecutivos, mas em outros casos não funcionará como esperado - por exemplo, se
$array
tiver definido índices para 1, 3, 5, 7, 11, 13, 17 then${#array[@]}
retornará 7 e tal loop irá iterar de 0..6 (ou 0..7 se você usar<=
em vez de<
como condição de teste) em vez da lista de índices reais na matriz.Por exemplo:
Basta fazer um loop sobre os índices. por exemplo
Em vez de
echo
, você pode usarprintf
para mais controle de formato, por exemplopara alinhar etiquetas com até 6 letras e números com até 3 dígitos.
Para aqueles que não precisam usar
bash
,zsh
usando seu${arrayA:^arrayB}
operador de compactação de matriz:Embora você nem precise do loop:
print
s-losr
awa
cruz em2
C
colunas.No entanto, aqui você também pode fazer:
Para
print
essas duas matrizesr
aw em2
C
colunas (deixando de fora-a
aqui).Observe que você pode criar uma matriz associativa dessas duas matrizes (o que parece fazer mais sentido aqui) com:
Se rótulos ou valores podem incluir a string vazia, você prefere usar:
para preservá-los.
E depois:
Para
print
k
olhos ev
aloresr
aw,a
cruze em2
C
colunas ou para preservar chaves/valores vazios:Ou:
Ou:
Cuidado, porém, que a ordem na qual os itens do array associativo são expandidos não é especificada.
Copiando uma das matrizes para o conjunto de parâmetros posicionais e, em seguida, usando
$1
no loop para acessar o primeiro deles. Comshift
, o primeiro parâmetro posicional é deslocado da lista e o que antes era o segundo elemento se torna o primeiro.Isso evita o uso de indexação para obter os elementos da matriz dentro do loop.
Saída (delimitada por tabulação):