Tips en Trucs 2011

Variabelen aan Bash-functies doorgeven

Vele beweren dat het via parameters doorgeven van namen van plaatshouders (variabelen) aan functies in Bash, de namen van de plaatshouders als letterlijke tekst (tekenreeks, string) wordt behandeld waardoor de waarde van de plaatshouder verloren gaat. Programmeurs noemen dit doorverwijzing (dereference). Wel doorverwijzing (dereference) in Bash is wel mogelijk.

Het volgende script bewijst dit:
#!/bin/bash
NaarFunctieDoorverwezenPlaatshouder() {
    if [ -n "$1" ] ; then
        echo "De waarde van [${1}] is: [${!1}]"
    else
        echo "Geen parameter aan de functie doorgegeven"
    fi
}
Plaatshouder="PindaNet"
NaarFunctieDoorverwezenPlaatshouder Plaatshouder
Als je bovenstaande code in een bestand opslaat en uitvoert, krijg je de volgende uitvoer:
dany@linux-4wlv:~> chmod +x PlaatshouderDoorverwijzenInFunctie.sh 
dany@linux-4wlv:~> ./PlaatshouderDoorverwijzenInFunctie.sh 
De waarde van [Plaatshouder] is: [PindaNet]
Het geheim zit in het gebruik van ! bij het interpreteren van ${!1}. De Bash handleiding vermeld:
Als het eerste teken van een parameter een uitroepteken is, wordt een doorverwijzing gebruikt. Bash gebruikt de rest van de parameter als de naam van een plaatshouder; de waarde van de zo gevonden plaatshouder wordt opgehaald en gebruikt in de plaats van de oorspronkelijke waarde. Dit staat bekend als indirecte benadering (indirect expansion).