Si j'ai un tableau avec 5 éléments, par exemple:
[a][b][c][d][e]
En utilisant echo ${myarray[4]}
je peux voir ce qu’il contient.
Mais que se passe-t-il si je ne connais pas le nombre d'éléments dans un tableau donné? Existe-t-il un moyen de lire le dernier élément d'un tableau de longueur inconnue? ie le premier élément lisant de droite à gauche pour un tableau?
Je voudrais savoir comment faire cela à Bash.
$@
n'est pas exactement un tableau (ne peut pas être souscrit). Pour cela, voir Obtenir le dernier argument transmis à un script shell .Réponses:
Vous pouvez simplement utiliser un index négatif
${myarray[-1]}
pour obtenir le dernier élément. Vous pouvez faire la même chose pour l'avant-dernier, et ainsi de suite; dans Bash:La même chose fonctionne également pour la cession. Quand il dit "expression", cela signifie vraiment une expression; vous pouvez y écrire n'importe quelle expression arithmétique pour calculer l'index, y compris celle qui calcule en utilisant
${#myarray[@]}
explicitement la longueur du tableau .la source
ksh
etzsh
aussi bien.zsh
cependant, par des réseaux par défaut sont 1-indexés, à la différencebash
etksh
où ils sont 0 indexées.Bash moderne (v4.1 ou mieux)
Vous pouvez lire le dernier élément à l'index
-1
:La prise en charge de l'accès aux tableaux indexés numériquement à partir de la fin à l'aide des index négatifs a démarré avec bash version 4.1-alpha .
Ancien bash (v4.0 ou antérieur)
Vous devez obtenir la longueur du tableau à partir de
${#a[@]}
puis soustraire un pour obtenir le dernier élément:Puisque bash considère les indices de tableau comme une expression arithmétique, il n’est pas nécessaire d’utiliser une notation supplémentaire, telle que
$((...))
, pour forcer l’évaluation arithmétique.la source
modern
avec une version.bash
l’affectation de tableau, la référence, la suppression avec un indice négatif n’ont été ajoutées que dans bash 4.3 . Avec l'ancienne version debash
, vous pouvez utiliser l'expression dans l'indexarray[${#array[@]-1}]
Vous pouvez également utiliser une version plus ancienne de
bash
(bash 3.0 ou supérieure):ou:
En utilisant un décalage négatif, vous devez séparer
:
avec-
pour éviter toute confusion avec l':-
extension.la source
"${a[@]: -1}"
et ça marchera (à côtébash
etzsh
aussi) dansksh
.zsh
orbash
; mais je l'ai testé dans les trois coques.)tableau
Les alternatives les plus anciennes à bash (depuis bash 3.0+) sont:
L'espace est requis pour éviter l'interprétation de
:
suivi d'un moins-
comme développement de"${var:-abc}"
(Utiliser les valeurs par défaut).Le
~
est une négation arithmétique au niveau du bit (équivalent à son complément ou retournement de tous les bits ). De l'homme bash:Depuis bash-4.2 + aussi:
Depuis bash 5.0+ aussi:
Pour toutes les versions de bash (ancien bash):
@
Pour les arguments de position (depuis bash 2.01):
Une solution portable pour tous les shells consiste à utiliser eval:
la source
~
dans le manuel et je ne l'ai pas vu.$@
?bash: ${@[@]:(-1)}: bad substitution
man bash
référence (cochez la réponse développée dans le @ titre). @TomHale@
n'est pas un tableau (enfin, pas tout à fait un tableau ) dans bash et il n'accepte pas l'indice ([]
) pour les arguments individuels. Vous devez utiliser${@:(-1)}
ou équivalent. Vérifiez l'entrée élargie au@
titre. @TomHaleAussi, vous pouvez faire ceci:
Résultat:
Ce que vous faites, c'est obtenir le nombre total d'éléments dans le tableau et soustraire -1, car vous obtenez tous les éléments, sans partir de l'index de tableau qui est 0.
la source