como contar o comprimento de uma matriz definida no bash?

58

Eu 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", como a saída esperada desse valor:

1/3
2/3
3/3

Obrigado por qualquer tipo de dicas

AGamePlayer
fonte
Observe que você deve colocar ${array[@]}aspas duplas. Caso contrário, a divisão de palavras será realizada e você obterá resultados indesejáveis, em entradas como array=("item 1" "item 2" "item 3").
precisa saber é o seguinte

Respostas:

102

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ê deseja que a contagem seja executada a partir de 1, você pode substituir $indexpor $((index+1)). Se você quiser que os valores , bem como os índices que você pode usar "${array[index]}"isto

#!/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
chave de aço
fonte
Se eu quiser obter 1,2,3, posso fazer o seguinte echo ($index+1)/${#array[@]}:?
AGamePlayer 28/03
Aliás, parece que dessa maneira não consigo obter o item1, o item2, o item3 no loop. Eu ainda tenho outro código para lidar com o item1, item2, item3. Obrigado,
AGamePlayer
Veja postagem editada.
steeldriver
1

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

Com algumas implementações básicas, você pode optar arbitrariamente por ter um 0ou 1como o primeiro índice. E pelo menos um básico permite designar matrizes para o índice do fron [n]para [m]. onde ne mpode ter qualquer valor inteiro, mesmo negativo, contanto que nseja menor ou igual a m. O valor ao qual neles são subtraídos dos [index]inseridos, como index-n = 0se o índice correspondesse n.

Mas você pode fazer a mesma coisa e muito mais em seu próprio código. Você pode até reverter a ordem de uma matriz 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 na qual você está se movendo, seja positiva ou negativa, e é usada para calcular o índice efetivo ao entrar ou sair da matriz, na qual é sempre sempre positivo [0].

Donald Darden
fonte