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
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]
.
${array[@]}
entre guillemets. Sinon, le fractionnement de mots sera effectué et vous obtiendrez des résultats indésirables, sur des entrées telles quearray=("item 1" "item 2" "item 3")
.