• [^] # Re: le langage est bash, donc le langage est bash

    Posté par (site web personnel, Mastodon) . En réponse au journal bake : scripter en bash à la « makefile ». Évalué à 4.

    Personnellement je ne demande pas grand chose à bash, je sous-utilises ses capacités avancées en fait, mais certaines fonctionnalités sont vraiment pratiques, comme les array.

    Je veux pouvoir faire ça, et itérer tout ça :

    vars=("un deux" blabla)
    for var in "${var[@]}"
    do
     echo "${var}"
    done

    Utiliser des hacks comme ça, ça ne marche pas:

    vars='un deux blabla'
    for var in ${vars}
    do
     echo "${var}"
    done

    Et ça, c’est dégueulasse et ça invoque des bugs les soirs de pleine-lune :

    vars="un deux
    blabla"
    cat "${vars}" | while read "${var}"
    do
     echo "${var}"
    done

    Oui je sais on peut aussi modifier IFS, mais bref, tout ça c’est moche et ce sont des nids à problèmes.

    Le code de tableau ci-dessus fonctionne sous macOS parce que c’est un exemple très limité, mais dès qu’on passe un tableau en paramètre à une fonction, tout s’écroule.

    Ça, ça ne marge pas avec le bash de macOS :

    func()
    {
     for var in "${@}"
     do
     echo "${var}"
     done
    }
    vars=()
    if "${something}"
    then
     vars+=("blabla")
    fi
    func "$[vars[@]}"

    Quand le tableau est vide, alors ${@} n’est pas déclarée dans la fonction, et donc le script s’interrompt à cause de la variable inconnue dès lors qu’on active set -u.

    On peut contourner en faisant quelque chose comme ça :

    func()
    {
     if -z "${@:-}"
     then
     return
     fi
     for var in "${@}"
     do
     echo "${var}"
     done
    }
    vars=()
    if "${something}"
    then
     vars+=("blabla")
    fi
    func "$[vars[@]}"

    Bon, j’ai écrit ce commentaire de mémoire, il y a peut-être encore de nuances obscures, et j’ai peut-être aussi fait des fautes, mais vous voyez l’idée. Il faut dégueulasser les scripts avec ce genre de contournements pour le bash de 2007 de macOS.

    ce commentaire est sous licence cc by 4 et précédentes