#! /bin/bash
# array-assign.bash

#  Les opérations sur les tableaux sont spécifiques à Bash,
#+ d'où le ".bash" dans le nom du script.

# Copyright (c) Michael S. Zick, 2003, All rights reserved.
# License: Unrestricted reuse in any form, for any purpose.
# Version: $ID$
#
# Clarification et commentaires supplémentaires par William Park.

#  Basé sur un exemple de Stephane Chazelas
#+ qui est apparu dans le livre : Advanced Bash Scripting Guide.

# Format en sortie de la commande 'times' :
# CPU Utilisateur &lt;espace&gt; CPU système
# CPU Utilisateur du fils mort &lt;space&gt; CPU système du fils mort

#  Bash a deux versions pour l'affectation de tous les éléments d'un tableau
#+ vers une nouvelle variable tableau.
#  Les deux jetent les éléments à référence nulle
#+ avec Bash version 2.04, 2.05a et 2.05b.
#  Une affectation de tableau supplémentaire qui maintient les relations de
#+ [sousscript]=valeur pour les tableaux pourrait être ajoutée aux nouvelles
#+ versions.

#  Construit un grand tableau en utilisant une commande interne,
#+ mais tout ce qui peut construire un tableau de quelques milliers d'éléments
#+ fera l'affaire.

declare -a grandElement=( /dev/* ) # Tous les fichiers de /dev...
echo
echo 'Conditions : Sans guillemets, IFS par défaut, Tout élément'
echo "Le nombre d'éléments dans le tableau est ${#grandElement[@]}"

# set -vx



echo
echo '- - test: =( ${array[@]} ) - -'
times
declare -a grandElement2=( ${grandElement[@]} )
# Notez les parenthèses  ^                    ^
times


echo
echo '- - test: =${array[@]} - -'
times
declare -a grandElement3=${grandElement[@]}
# Pas de parenthèses cette fois-ci.
times

#  Comparer les nombres montre que la deuxième forme, indiquée par
#+ Stephane Chazelas, est de trois à quatre fois plus rapide.
#
#  Comme William Park l'explique :
#+ Le tableau grandElement2 est affecté élément par élément à cause des parenthèses
#+ alors que grandElement3 est affecté en une seule chaîne.
#  Donc, en fait, vous avez :
#                   grandElement2=( [0]="..." [1]="..." [2]="..." ... )
#                   grandElement3=( [0]="... ... ..." )
#
#  Vérifiez ceci avec : echo ${grandElement2[0]}
#                       echo ${grandElement3[0]}

#  Je continuerais à utiliser la première forme dans mes descriptions d'exemple
#+ parce que je pense qu'il s'agit d'une meilleure illustration de ce qu'il se
#+ passe.

#  Les portions réutilisables de mes exemples contiendront réellement la
#+ deuxième forme quand elle est appropriée en ce qui concerne sa rapidité.

# MSZ : Désolé à propos de ce survol précédent.

#  Note :
#  -----
#  Les instructions "declare -a" des lignes 31 et 43 ne sont pas strictement
#  nécessaires car c'est implicite dans l'appel de Array=( ... )
#  Néanmoins, éliminer ces déclarations ralentit l'exécution des sections
#  suivantes du script.
#  Essayez et voyez ce qui se passe.

exit 0
