¿Cómo contar la longitud de una matriz definida en bash?

Soy nuevo en bash y no puedo encontrar un buen tutorial para responder a mi pregunta.

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

Quiero calcular el valor current y total, ya que el resultado esperado de esto es:

1/3 2/3 3/3 

Gracias por cualquier tipo de consejo.

Comentarios

  • Tenga en cuenta que debe poner ${array[@]} entre comillas dobles. De lo contrario, se realizará la división de palabras y obtendrá resultados no deseados en entradas como array=("item 1" "item 2" "item 3").

Responder

Puede acceder a los índices de la matriz usando ${!array[@]} y la longitud de la matriz usando ${#array[@]} , p.ej :

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

Tenga en cuenta que dado que las matrices bash están indexadas en cero , obtendrá:

0/3 1/3 2/3 

Si desea que el recuento se ejecute desde 1, puede reemplazar $index por $((index+1)). Si desea los valores así como los índices, puede usar "${array[index]}" ie

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

Comentarios

  • Si quiero obtener 1,2,3, puedo Hago esto: echo ($index+1)/${#array[@]}?
  • por cierto, parece que de esta manera no puedo ' obtener item1, item2, item3 en el bucle. Todavía tengo otro código para lidiar con las cosas item1, item2, item3. Gracias,
  • Ver la publicación editada.

Respuesta

Un índice cero es perfectamente válido si piensa que el índice es en realidad un compensado de la dirección base de una matriz. De hecho, esa es la norma, aunque varía de un dialecto a otro. Con el antiguo lenguaje jovial, [0] en realidad contenía el tamaño máximo de la matriz. Así que comenzaba con [1].

Con algunas implementaciones básicas, puede elegir arbitrariamente tener 0 o 1 como primer índice. Y al menos un Basic le permite designar matrices para indexar desde [n] a [m]. donde n y m pueden tener cualquier valor entero, incluso negativo, siempre que n sea menor que o igual a m. El valor n se resta del [index] ingresado, como index-n = 0 si el índice corresponde a n.

Pero puede hacer lo mismo y más en su propio código . Incluso puedes invertir el orden de una matriz de esta manera:

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

Este ejemplo de código es en realidad solo una parte de un idioma. Solo quería que fuera más legible. La variable de paso se usa para controlar la dirección aparente en la que se mueve, ya sea positiva o negativa, y se usa para calcular el índice efectivo al entrar o salir de la matriz, que en realidad es siempre positivo desde [0].

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *