comment compter la longueur dun tableau défini dans bash?

Je suis nouveau dans bash et je ne peux pas trouver 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 la valeur current et total, comme la sortie attendue de ceci étant:

1/3 2/3 3/3 

Merci pour tout type de conseils.

Commentaires

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

Réponse

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 fait:

0/3 1/3 2/3 

Si vous voulez que le décompte part de 1, vous pouvez remplacer $index par $((index+1)). Si vous voulez les valeurs ainsi que les indices, vous pouvez utiliser "${array[index]}" ie

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

Commentaires

  • Si je veux obtenir 1,2,3, je peux Je fais ceci: echo ($index+1)/${#array[@]}?
  • btw, il semble que de cette façon je ne puisse ' t obtenir item1, item2, item3 dans la boucle. Jai encore un autre code pour traiter les éléments item1, item2, item3. Merci,
  • Voir larticle modifié.

Réponse

Un index zéro est parfaitement valide si vous pensez que lindex est en fait un offset à partir de ladresse de base dun tableau. Cest la norme en fait, bien que cela varie dun dialecte à lautre. Avec lancien langage jovial, [0] contenait en fait la taille maximale du tableau. Il commençait donc par [1].

Avec certaines implémentations de base, vous pouvez choisir arbitrairement davoir 0 ou 1 comme premier index. Et au moins un Basic vous permet de désigner des tableaux à indexer de [n] à [m]. où n et m peuvent avoir nimporte quelle valeur entière, même négative, tant que n est inférieur supérieur ou égal à m. La valeur n eux est soustraite de la valeur [index] saisie, comme index-n = 0 si lindex correspond à n.

Mais vous pouvez faire la même chose et plus dans votre propre code . Vous pouvez même inverser l’ordre dun 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 nest en fait que partiellement dune langue. Je voulais juste quil soit plus lisible. La variable step est utilisée pour contrôler la direction apparente dans laquelle vous vous déplacez, quelle soit positive ou négative, et est utilisée pour calculer lindice effectif lors de lentrée ou de la sortie du tableau, qui est en fait toujours positif de [0].

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *