Ce qui n'affiche rien, comme si on essaye d'afficher $1 alors que $#=0. Donc tableau[5]='valeur5' ne signifie pas "la case n°5 vaut 'valeur5'" mais plutôt "L'index de valeur '5' du tableau vaut 'valeur5'". Donc on n'agrandit pas le tableau, on y ajoute une case dont l'index vaut '5', c'est bien ça ?
En fait, les tableaux en Shell sont plus comparables à des std::map en C++ plutôt qu'à des tableaux en C non ? En plus d'être protégés contre les Erreurs de Segmentation en cas de lecture d'une case inexistante !
Donc, la définition d'un tableau en Shell serait l'équivalent en C++ d'une std::map du genre
template <typename T>
std::map<unsigned int Key, T valeur> tableau;
(T parce que le tableau peut autant contenir des nombres que des chaînes). Alors est-ce qu'on peut définir un tableau Shell dont l'index de référencement des valeurs serait d'un autre type qu'un unsigned int ?
Voilà, je voulais juste savoir si je comprends bien ! Qu'en pensez-vous ?
- Edité par apple.juice 19 juillet 2016 à 13:53:07
M'en veuillez pas. Si je suis ici c'est que je suis vraiment crevé :^D
Tu peux effectivement considérer les tableaux comme des std::map<unsigned, std::string>.
Pour les tableaux associatifs (à la différence des tableaux indexés), il faut déclarer la variable comme tel: declare -A assoc_tab. Après on peut l'initialiser avec assoc_tab=([k1]=valeur1 [k2]=valeur2). Les 2 lignes peuvent être ensemble sans problème declare -A assoc_tab=(...).
Et assoc_tab[k]=v pour ajouter/modifier une valeur.
Par contre, utiliser * pour manipuler les valeurs est une connerie, surtout en bash: cela ne prend pas du tout en compte les espaces. Je t'invite à regarder les différents comportements avec le script suivant:
#!/bin/bash
tab=('a b' c)
count () { echo $# ; }
echo -n '${tab[*]}:'; count ${tab[*]}; for x in ${tab[*]} ; do echo "$x" ; done
echo -n '${tab[@]}:'; count ${tab[@]}; for x in ${tab[@]} ; do echo "$x" ; done
echo -n '"${tab[*]}":'; count "${tab[*]}"; for x in "${tab[*]}" ; do echo "$x" ; done
echo -n '"${tab[@]}":'; count "${tab[@]}"; for x in "${tab[@]}" ; do echo "$x" ; done
Note: Pour récupérer les clefs d'un tableau: "${!tableau[@]}".
- Edité par jo_link_noir 19 juillet 2016 à 22:39:03
Wow ! Alors ça, c'est bon à savoir ! Avec les 2 premières lignes, Bash interprète 'a b' comme 2 paramètres différents et ignore les espaces Avec la troisième, le '*' renvoie tous les paramètres en tant qu'un seul paramètre (disons qu'il renvoie "un tout").
La 4ème ligne, en revanche, permet bien de parcourir le tableau et récupérer toutes ses valeurs en tant que paramètres séparés ( 'a b' et c ).
Donc les 2 premières lignes sont à proscrire, la 3ème est bien pour concaténer les valeurs (et encore, il les sépare par un espace), et la 4ème est celle de choix pour parcourir les valeurs une à une.
Merci beaucoup jo_link_noir, très instructif ! (Et si j'ai mal compris, je t'en prie engueule moi ).
- Edité par apple.juice 20 juillet 2016 à 21:06:15
M'en veuillez pas. Si je suis ici c'est que je suis vraiment crevé :^D
Concernant les espaces ajoutés, c'est configurable avec la variable IFS qui contient les séparateurs d'arguments. Le problème est qu'IFS influence aussi read, ce qui rend quasi obligatoire de la remettre dans son état précédent.
Tiens, je ne connaissais pas eval, j'ai fait une petite recherche, pratique comme fonction (enfin, comme "built-in") !
Très intéressant cette fonction showtab() ! J'ai eu du mal à découper l'entrelacement des ' ' et des " " (oui oui, je débute en bash ), mais une fois qu'on le voit, c'est juste énorme !
eval, $IFS et [@] sont dans ma fiche mémo ! Merci pour tous ces conseils !!!
- Edité par apple.juice 21 juillet 2016 à 0:47:57
M'en veuillez pas. Si je suis ici c'est que je suis vraiment crevé :^D
Tableau Bash comparé à std::map (C++) ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.