Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

exemple en GNU bash de variable tableau

0 views
Skip to first unread message

Basile Starynkevitch

unread,
Jan 29, 2024, 5:30:06 AMJan 29
to
Bonjour la liste

Dans https://github.com/RefPerSys/RefPerSys (un projet de moteur
d'inférences sous licence GPLv3+ pour Debian) j'essaie de coder un
script en bash de configuration (simple).

Voir le commit bfb1314 du fichier do-configure-refpersys.bash

(les commentaires sont en mauvais englais)

J'essaie de collecter dans une variable tableau de bash files_to_remove
les fichiers temporaires (qu'il faudrait suprimer à la fin de cez script).

Je n'arrive pas à comprendre la syntaxe des variables tableau en GNU bash.

Pour info, mon ordinateur est x86-64 sous Debian/Trixie mis à jour ce matin.

Avec GNU bash, version 5.2.21(1)-release (x86_64-pc-linux-gnu)

Merci de vos eclairages, ou bien d'un exemple (moins de cent lignes de
GNU bash) qui utilise une variable tableau en y ajouter (dans une
itération) des éléments (ici des noms de fichiers à supprimer plus tard)


Librement
--
Basile Starynkevitch <bas...@starynkevitch.net>
(only mine opinions / les opinions sont miennes uniquement)
92340 Bourg-la-Reine, France
web page: starynkevitch.net/Basile/
See https://github.com/RefPerSys/RefPerSys

didier gaumet

unread,
Jan 29, 2024, 6:50:04 AMJan 29
to
Bonjour,

Avertissement: j'ai jamais vraiment écrit quoi que ce soit en Bash donc
ne pas se fier aveuglément à mes paroles

De ce que je comprends, Bash ne gère pas nativement les tableaux
multi-dimensions (cf la doc Bash):
https://www.gnu.org/software/bash/manual/html_node/Arrays.html

il faut donc contourner cette limitation. Un exemple ici:
https://unix.stackexchange.com/questions/611813/how-to-implement-2d-matrix-using-shell-script

bidons59

unread,
Jan 29, 2024, 7:40:04 AMJan 29
to
Bonjour

Suis certainement à côté de la plaque, mais l'instruction "trap"
pourrait peut être faire l'affaire?

Michel Verdier

unread,
Jan 29, 2024, 10:50:03 AMJan 29
to
Le 29 janvier 2024 Basile Starynkevitch a écrit :

> J'essaie de collecter dans une variable tableau de bash files_to_remove les
> fichiers temporaires (qu'il faudrait suprimer à la fin de cez script).

Pourquoi un tableau ? Une simple liste ne suffit pas ?

Basile Starynkevitch

unread,
Jan 29, 2024, 12:30:04 PMJan 29
to
Bien sûr que si, pour le script
https://github.com/RefPerSys/RefPerSys/blob/master/do-configure-refpersys.bash

(le script de configuration du moteur d'inférences libre RefPerSys en
http://refpersys.org/ ....)

*Une liste simplement chainée mais _mutable_ conviendrait tout à fait.*


La question plus technique devient: *comment implémente-t-on* (en
quelques lignes de GNU bash sous Linux) *une telle liste simplement
chainée*.


Pour rappel: C++ a des listes simplement chainées (pour les détails
consulter https://en.cppreference.com/w/cpp/container/list ...)

et Ocaml a des listes simplement chainées (pour les détails consulter
https://v2.ocaml.org/api/List.html ....)

et Guile ou Scheme a des listes simplement chainées (voir la section
6.3.2 du R5RS
<https://conservatory.scheme.org/schemers/Documents/Standards/R5RS/HTML/>)


Un exemple en GNU bash (testable sous Linux) de liste simplement chainée
me convient.

L'exemple
https://www.unix.com/shell-programming-and-scripting/271790-implementing-linked-list-shell-scripting.html
me parait trop long.


Je souhaite un exemple bien plus simple, ou bien la suggestion de passer
de GNU bash à autre chose (je songe peut-être à Python, que je ne
connais guère).


Pour les aspects "philosophiques" de RefPerSys n'hésitez pas à consulter
https://afia.asso.fr/journee-hommage-j-pitrat/


Pour un brouillon de papier en anglais (ou même un brouillon très
incomplet en français), me contacter par courriel

Librement.

Étienne Mollier

unread,
Jan 29, 2024, 2:30:04 PMJan 29
to
Bonsoir Basile,

Basile Starynkevitch, on 2024-01-29:
> J'essaie de collecter dans une variable tableau de bash files_to_remove les
> fichiers temporaires (qu'il faudrait suprimer à la fin de cez script).
>
> Je n'arrive pas à comprendre la syntaxe des variables tableau en GNU bash.

Comme le veut l'adage, un exemple clair vaut mieux que des
mégaoctets de documentation. Pour initialiser les entrées d'un
tableau, on peut faire comme ceci :

$ TAB[0]='zero'
$ TAB[1]='un'
$ TAB[2]='deux'

Et pour accéder aux valeurs, il faut impérativement entourer la
variable avec l'index d'accolades, comme suit :

$ echo "${TAB[0]}"
zero
$ echo "${TAB[1]}"
un
$ echo "${TAB[2]}"
deux

Il y a deux méthodes bien distinctes pour accéder à tous les
éléments d'un coup, via l'astérisque ou l'arobaze, illustrées
par l'exemple ci-dessous :

$ for elem in "${TAB[*]}"; do echo " * $elem"; done
* zero un deux
$ for elem in "${TAB[@]}"; do echo " * $elem"; done
* zero
* un
* deux

À noter que dans ce genre de situations, il devient essentiel
d'être clair sur l'usage systématique des double quotes.

Une construction courante pour accéder aux éléments à partir de
l'index, comme celà arrive fréquemment en langages compilés
impératifs, peut ressembler à ça :

$ for i in $(seq 0 2) ; do echo " $i. ${TAB[$i]}"; done
0. zero
1. un
2. deux

Il est aussi possible de construire et de concaténer des
tableaux avec l'opérateur "parenthèse", par exemple :

$ TAB=( "${TAB[@]}" "trois" "quatre" )
$ for elem in "${TAB[@]}"; do echo " * $elem"; done
* zero
* un
* deux
* trois
* quatre

Là encore, l'usage de l'arobase et des double quotes est
essentiel pour que la concaténation se passe comme attendu :

$ TAB_SUITE=( "le cinquieme" "le sixieme" )
$ TAB_INATTENDU=( "${TAB[*]}" ${TAB_SUITE[@]} )
$ for elem in "${TAB_INATTENDU[@]}" ; do echo " * $elem" ; done
* zero un deux trois quatre
* le
* cinquieme
* le
* sixieme
$ TAB_ATTENDU=( "${TAB[@]}" "${TAB_SUITE[@]}" )
$ for elem in "${TAB_ATTENDU[@]}" ; do echo " * $elem" ; done
* zero
* un
* deux
* trois
* quatre
* le cinquieme
* le sixieme

La documentation de référence sur les tableaux du bash se trouve
dans le manuel de bash(1) au chapitre "Array", qui peut être
retrouvé en effectuant une recherche de l'expression rationnelle
"^ Arrays".

Bonne soirée, :)
--
.''`. Étienne Mollier <emol...@debian.org>
: :' : pgp: 8f91 b227 c7d6 f2b1 948c 8236 793c f67e 8f0d 11da
`. `' sent from /dev/pts/5, please excuse my verbosity
`- on air: Life Line Project - Unica
signature.asc
0 new messages