comment compter la longueur d'un tableau défini dans bash?

58

Je suis nouveau sur bash et je ne trouve pas un bon tutoriel pour répondre à ma question.

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

Je veux calculer les valeurs "actuelle" et "totale", comme le résultat attendu de ceci:

1/3
2/3
3/3

Merci pour tout type de conseils

AGamePlayer
la source
Notez que vous devez mettre ${array[@]}des guillemets doubles. Sinon, le fractionnement des mots sera effectué et vous obtiendrez des résultats indésirables, sur des entrées telles que array=("item 1" "item 2" "item 3").
Gardenhead

Réponses:

102

Vous pouvez accéder aux index du tableau en utilisant ${!array[@]}et la longueur du tableau en utilisant ${#array[@]}, par exemple:

#!/bin/bash

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

Notez que puisque les tableaux bash sont indexés à zéro , vous obtiendrez en réalité:

0/3
1/3
2/3

Si vous voulez que le nombre commence à 1, vous pouvez le remplacer $indexpar $((index+1)). Si vous voulez les valeurs ainsi que les indices que vous pouvez utiliser "${array[index]}"c'est à dire

#!/bin/bash

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

donnant

1/3 = item1
2/3 = item2
3/3 = item3
Steeldriver
la source
Si je veux obtenir 1,2,3, puis-je faire ceci echo ($index+1)/${#array[@]}:?
AGamePlayer
En passant, il semble que de cette façon, je ne peux pas obtenir item1, item2, item3 dans la boucle. J'ai encore un autre code pour traiter les éléments item1, item2, item3. Merci,
AGamePlayer
Voir le post édité.
Steeldriver
1

Un indice zéro est parfaitement valide si vous pensez qu’il est en réalité un décalage par rapport à l’adresse de base d’un tableau. C'est la norme en fait, même si cela varie d'un dialecte à l'autre. Avec l’ancien langage Jovial, [0]contenait réellement la taille maximale du tableau. donc ça a commencé avec [1].

Avec certaines implémentations de base, vous pouvez choisir arbitrairement d’avoir le premier 0ou 1l’index. Et au moins un de base vous permet de désigner des tableaux à l' index Fron [n]à [m]. où net mpeut avoir n'importe quelle valeur entière, même négative, tant qu'elle nest inférieure ou égale à m. La valeur qui nleur est déduite de la valeur [index]saisie, comme index-n = 0si l’indice correspondait n.

Mais vous pouvez faire la même chose et plus encore dans votre propre code. Vous pouvez même inverser l'ordre d'un tableau de cette façon:

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

Cet exemple de code n'est en réalité que partiellement d'une seule langue. Je voulais juste que ce soit plus lisible. La variable de pas sert à contrôler la direction apparente dans laquelle vous vous dirigez, qu'elle soit positive ou négative, et à calculer l'indice effectif lorsque vous entrez dans le tableau ou en sortez, ce qui est en fait toujours positif [0].

Donald Darden
la source