$@
n'est pas un vrai tableau - c'est un "paramètre spécial" de l'interpréteur de commandes, et vous devez être un peu plus prudent avec lui qu'avec les autres tableaux.
La raison du comportement que vous observez est que le comportement exact de la fonction ${parameter:length:offset}
est un cas particulier lorsque parameter
es @
et le comportement n'est pas cohérent avec le comportement que vous obtiendriez si @
était un vrai tableau.
Voici la documentation pertinente ( en gras c'est moi qui souligne) :
${
paramètre :
décalage :
longueur }
... Si paramètre est @, le résultat est longueur paramètres de position à partir de décalage . Si paramètre est @, le résultat est longueur paramètres positionnels commençant à décalage . ...
Le site paramètres de position sont $0
, $1
, $2
..., donc avec cette syntaxe, il se comporte comme si $@
contenait le nom du script ( $0
) ainsi que les paramètres du script ( $1
, $2
, ...). Ceci est incompatible avec "$@"
en s'étendant à "$1" "$2" ...
mais c'est la vie.
Vous devriez pouvoir simplifier les choses (et corriger le script) en créant un nouveau tableau au lieu d'utiliser $@
directement, c'est-à-dire
new_array=("$@")
for (( i = 0; i < ${#new_array}; i++ )); do
hash=$(md5 -q ${new_array[@]:$i:1})
modifiedNames[$i]=${new_array[@]:$i:1}$hash
done
echo ${modifiedNames[1]}