#!/bin/bash
# empty-array.sh

#  Merci à Stephane Chazelas pour l'exemple original
#+ et à Michael Zick et Omair Eshkenazi pour son extension.


#  Un tableau vide n'est pas la même chose qu'un tableau composé d'éléments
#+ vides.

tableau0=( premier deuxieme troisieme )
tableau1=( '' )   # "tableau1" consiste en un élément vide.
tableau2=( )      # Pas d'éléments . . . "tableau2" est vide.
tableau3=(   )    # Que peut-on dire de ce tableau ?

echo
AfficheTableau()
{
echo
echo "Éléments de tableau0 :  ${tableau0[@]}"
echo "Éléments de tableau1 :  ${tableau1[@]}"
echo "Éléments de tableau2 :  ${tableau2[@]}"
echo "Éléments de tableau3 :  ${tableau3[@]}"
echo
echo "Longueur du premier élément du tableau0 = ${#tableau0}"
echo "Longueur du premier élément du tableau1 = ${#tableau1}"
echo "Longueur du premier élément du tableau2 = ${#tableau2}"
echo "Longueur du premier élément du tableau3 = ${#tableau3}"
echo
echo "Nombre d'éléments du tableau0 = ${#tableau0[*]}"  # 3
echo "Nombre d'éléments du tableau1 = ${#tableau1[*]}"  # 1  (Surprise !)
echo "Nombre d'éléments du tableau2 = ${#tableau2[*]}"  # 0
echo "Nombre d'éléments du tableau3 = ${#tableau3[*]}"  # 0
}

# ===================================================================

AfficheTableau

# Essayons d'étendre ces tableaux.

# Ajouter un élément à un tableau.
tableau0=( "${tableau0[@]}" "nouveau1" )
tableau1=( "${tableau1[@]}" "nouveau1" )
tableau2=( "${tableau2[@]}" "nouveau1" )
tableau3=( "${tableau3[@]}" "nouveau1" )

AfficheTableau

# ou
tableau0[${#tableau0[*]}]="nouveau2"
tableau1[${#tableau1[*]}]="nouveau2"
tableau2[${#tableau2[*]}]="nouveau2"
tableau3[${#tableau3[*]}]="nouveau2"

AfficheTableau

# Lors d'un ajout comme ci-dessus ; les tableaux sont des piles ('stacks')
# La commande ci-dessus correspond à un 'push'
# La hauteur de la pile est :
hauteur=${#tableau2[@]}
echo
echo "Hauteur de pile pour tableau2 = $hauteur"

# L'opération 'pop' est :
unset tableau2[${#tableau2[@]}-1] #  L'index des tableaux commence à zéro,
hauteur=${#tableau2[@]}           #+ ce qui signifie que le premier élément se
                                  #+ trouve à l'index 0.
echo
echo "POP"
echo "Nouvelle hauteur de pile pour tableau2 = $hauteur"

AfficheTableau

# Affiche seulement les 2è et 3è éléments de tableau0.
de=1		# Numérotation débutant à zéro.
a=2		#
tableau3=( ${tableau0[@]:1:2} )
echo
echo "Éléments de tableau3 :  ${tableau3[@]}"

# Fonctionne comme une chaîne (tableau de caractères).
# Essayez les autres formes de "chaînes".

# Remplacement :
tableau4=( ${tableau0[@]/deuxieme/2è} )
echo
echo "Éléments de tableau4 :  ${tableau4[@]}"

# Remplacez toutes les chaînes correspondantes.
tableau5=( ${tableau0[@]//nouveau?/ancien} )
echo
echo "Éléments de tableau5 :  ${tableau5[@]}"

# Juste quand vous commencez à vous habituer...
tableau6=( ${tableau0[@]#*nouveau} )
echo # Ceci pourrait vous surprendre.
echo "Éléments du tableau6 :  ${tableau6[@]}"

tableau7=( ${tableau0[@]#nouveau1} )
echo # Après tableau6, ceci ne devrait plus être une surprise.
echo "Éléments du tableau7 :  ${tableau7[@]}"

# Qui ressemble beaucoup à...
tableau8=( ${tableau0[@]/nouveau1/} )
echo
echo "Éléments du tableau8 :  ${tableau8[@]}"

#  Donc, que pouvez-vous conclure de ceci ?

#  Les opérations sur des chaînes sont réalisées sur chaque éléments
#+ de var[@] à la suite.
#  Donc : Bash supporte les opérations vectorielles sur les chaînes.
#  Si le résultat est une chaîne de longueur vide,
#+ l'élément disparaît dans l'affectation résultante.

#  Question, ces chaînes sont-elles entre simples ou doubles guillemets ?

zap='nouveau*'
tableau9=( ${tableau0[@]/$zap/} )
echo
echo "Éléments du tableau9 :  ${tableau9[@]}"

# Juste au moment où vous pensiez être toujours en pays connu...
tableau10=( ${tableau0[@]#$zap} )
echo
echo "Éléments du tableau10 :  ${tableau10[@]}"

# Comparez le tableau7 avec le tableau10.
# Comparez le tableau8 avec le tableau9.

# Réponse : Cela doit être des simples guillemets.

exit 0
