• exemple en GNU bash de variable tableau

    From Basile Starynkevitch@21:1/5 to All on Mon Jan 29 11:30:02 2024
    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 <basile@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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Michel Verdier@21:1/5 to All on Mon Jan 29 16:50:01 2024
    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 ?

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Basile Starynkevitch@21:1/5 to Michel Verdier on Mon Jan 29 18:30:01 2024
    On 1/29/24 16:48, Michel Verdier wrote:
    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 ?


    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.

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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From =?utf-8?Q?=C3=89tienne?= Mollier@21:1/5 to All on Mon Jan 29 20:30:01 2024
    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 <emollier@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

    -----BEGIN PGP SIGNATURE-----

    iQIzBAABCgAdFiEEj5GyJ8fW8rGUjII2eTz2fo8NEdoFAmW3+uQACgkQeTz2fo8N EdrAVxAAwABTt4eDj3xTH7ZRq1Uk0c0qLaoy8HCC4qXDVzXuqBO00jsXmBK1y2ht OaXUB1PUZz2fCztJBIwTNFphwcslDAQHDinZglcT79LGlhWPC4pE2ZIJhlGbivmv Gj0rh5vOIWK2kIp8h28Uw4fQ9k2HpZjlhaRiiJuJt28GoApoaNNZ9dZWHrjYc92D mhqyOZ0JYLlPEw+kT17kEv5bQIF3IWDe+u2XKL4It/FtUpIil5LlhSX5hsNLQ5lm JIH9/k7DANndpFaqD4vg0aysa3yvFbxPwDycmgrGRmKnKIdzLnSyDAMPEv5vvf/n nsHQ8KZdx5mC2RLC8v1HSy6bNRCkeC1AoaW6PqyjqgmkciUqnpsSkT/tTsNS0qkL Akn8vfvghWxo5mtPr5uZPEbPvFvMVsTkCUnOKVDk3XCxbPbHjYxpOiBCPumnpMX/ o4hgDlFNcfuBHzHK+5Sej+hQZqYFsGlVtcNZ/tbHYdkKA9IAa4xyvmGW8OzxwwQy NJrjr9QkSCHIE8idWwZdVbmtlRLFZg7bFs+iHIzbIM6/+d+LqQlftqjHIwQMi8iG J3mY7hBm7pdCR3OUvVFoUHBDLJuqbk84gp+4Y71S+kY4nTwN0OcqfqX90/tG9ZMT v3OMNu+q6Y6SXuda0juyIh8WGE4ep3/wBq4kmSIz