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

58

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

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

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

1/3
2/3
3/3

Gracias por cualquier tipo de consejos.

AGamePlayer
fuente
Tenga en cuenta que debe poner ${array[@]}entre comillas dobles. De lo contrario, se dividirá la palabra y obtendrá resultados no deseados, en entradas como array=("item 1" "item 2" "item 3").
cabeza de jardín

Respuestas:

102

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

#!/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 a cero , en realidad obtendrá:

0/3
1/3
2/3

Si desea que el recuento se ejecute desde 1, puede reemplazarlo $indexpor $((index+1)). Si desea los valores , así como los índices que puede utilizar, "${array[index]}"es decir

#!/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
conductor de acero
fuente
Si quiero obtener 1,2,3, ¿puedo hacer esto echo ($index+1)/${#array[@]}?
AGamePlayer
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,
AGamePlayer
Ver publicación editada.
Steeldriver
1

Un índice cero es perfectamente válido si piensa que el índice es realmente un desplazamiento 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, en [0]realidad contenía el tamaño máximo de la matriz. por lo que comenzó con [1].

Con algunas implementaciones básicas, puede elegir arbitrariamente tener uno 0o 1el primer índice. Y al menos un básico le permite designar a matrices índice de Fron [n]a [m]. donde ny mpuede tener cualquier valor entero, incluso negativo, siempre que nsea ​​menor o igual que m. El valor de nellos se resta de lo [index]ingresado, como index-n = 0si el índice correspondiera n.

Pero puede hacer lo mismo y más en su propio código. Incluso puede 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 en 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 está moviendo, ya sea positiva o negativa, y se usa para calcular el índice efectivo al entrar o salir de la matriz, que en realidad siempre es positivo [0].

Donald Darden
fuente