como contar o comprimento de uma matriz definida no bash?

47

Sou novo no bash e não consigo encontrar um bom tutorial para responder à minha pergunta.

array=( item1 item2 item3)
for name in ${array[@]}; do
    echo current/total
    ... some other codes
done

Eu quero calcular o valor "atual" e "total", pois a saída esperada é:

1/3
2/3
3/3

Obrigado por qualquer tipo de dicas

    
por AGamePlayer 28.03.2015 / 03:46

2 respostas

84

Você pode acessar os índices da matriz usando ${!array[@]} e o comprimento da matriz usando ${#array[@]} , por exemplo. :

#!/bin/bash

array=( item1 item2 item3 )
for index in ${!array[@]}; do
    echo $index/${#array[@]}
done

Observe que, como as matrizes bash são zero indexadas , você realmente obterá:

0/3
1/3
2/3

Se você quiser que a contagem seja executada a partir de 1, poderá substituir $index por $((index+1)) . Se você quiser os valores , bem como os índices, você pode usar "${array[index]}" , por exemplo,

#!/bin/bash

array=( item1 item2 item3 )
for index in ${!array[@]}; do
    echo $((index+1))/${#array[@]} = "${array[index]}"
done

dando

1/3 = item1
2/3 = item2
3/3 = item3
    
por 28.03.2015 / 03:56
2

Um índice zero é perfeitamente válido se você considerar o índice como sendo, na verdade, um deslocamento do endereço base de um array. Essa é a norma, embora varie de dialeto para dialeto. Com a antiga linguagem Jovial, [0] continha o tamanho máximo da matriz. então começou com [1] .

Com algumas implementações básicas, você pode escolher arbitrariamente ter 0 ou 1 como o primeiro índice. E pelo menos um Basic permite que você designe matrizes para indexar fron [n] to [m] . onde n e m podem ter qualquer valor inteiro, mesmo negativo, contanto que n seja menor ou igual a m . O valor n deles é subtraído do [index] inserido, pois index-n = 0 se o índice corresponder a n .

Mas você pode fazer a mesma coisa e mais no seu próprio código. Você pode até inverter a ordem de um array desta maneira:

dim array(0, abs(m-n)); 
step=sign(m-n); 
if n > m then 
    base=m 
else 
    base=n; 
fi

Este exemplo de código é, na verdade, apenas parcialmente de um idioma. Eu só queria que fosse mais legível. A variável step é usada para controlar a direção aparente em que você está se movendo, seja ela positiva ou negativa, e é usada para calcular o índice efetivo ao entrar ou sair da matriz, que na verdade é sempre positiva de [0] .

    
por 10.01.2016 / 08:41

Tags