como contar o comprimento de uma matriz definida em bash?

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 

Quero calcular o valor current e total, como a saída esperada disso sendo:

1/3 2/3 3/3 

Obrigado por qualquer tipo de dicas.

Comentários

  • Observe que você deve colocar ${array[@]} entre 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").

Resposta

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 os arrays bash são indexados por zero , você realmente obterá:

0/3 1/3 2/3 

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

#!/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 

Comentários

  • Se eu quiser obter 1,2,3, posso Eu faço isso: echo ($index+1)/${#array[@]}?
  • aliás, parece que desta forma eu não posso ' obter o item1, item2, item3 no loop. Eu ainda tenho outro código para lidar com as coisas item1, item2, item3. Obrigado,
  • Veja a postagem editada.

Resposta

Um índice zero é perfeitamente válido se você acha que o índice é, na verdade, um deslocamento do endereço base de uma matriz. Na verdade, essa é a norma, embora varie de dialeto para dialeto. Com a antiga linguagem Jovial, [0] na verdade continha o tamanho máximo da matriz. Portanto, começou com [1].

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

Mas você pode fazer a mesma coisa e muito mais em seu próprio código . Você pode até inverter a ordem de uma matriz desta forma:

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 positiva ou negativa, e é usada para calcular o índice efetivo ao entrar ou sair da matriz, que na verdade é sempre positiva de [0].

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *