Variabelen (Bash)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

Let op: Variabelen - ihb. expansion van variabelen, lijkt op nix dat ik uit andere programmeertalen ken.

Variabelen initialiseren

Belangrijk dat er geen spaties staan rondom aanroepen van variabelen:

in_bestand="2017.09.24-19.12.32-intermediate-01-org.mp4"
uit_bestand="2017.09.24-19.12.32-intermediate-01-uit.mp4"

echo $in_bestand
echo $uit_bestand

Expansion

In den beginne...

Tijdens de executie van zoiets als dit:

i="foo bar"
echo $i

Gebeuren er een paar dingen:

  1. De variabele wordt geëxpandeerd voordat het commando wordt uitgevoerd. Dus echo $i wordt eerst echo foo bar
  2. Speciale tekens in de geëxpandeerde variabele, worden niet ge-escaped ofzo. Het echo-commando ziet hier dus twee argumenten. Toevallig weet echo daar wel raad mee, maar dat geldt niet voor alle commando's

De spaties in geëxpandeerde variabelen, kun je ondervangen door de variabele binnen dubbele aanhalingstekens te zetten:

i="foo bar"
echo "$i"

Commando's en padnamen

Ik dacht een tijdje dat dit een extreem voorbeeld van expansie was - Probeer maar uit:

pad="/var/www/*"
echo $pad

maar dat is niet zo: echo /var/www/* geeft namelijk precies hetzelfde resultaat.

Desalniettemin is dit bepaald belangrijk. Dit is namelijk hoe shell-commando's vaak werken: Wildcards worden geëxpandeerd zodat ze precies de objecten benoemen waar de wildcard betrekking op heeft. Dat is waarom je bv. een probleem krijgt met rm * in een map met duizenden bestanden: De buffer waarin het geëxpandeerde commando wordt opgeslagen, raakt vol.

Zoals hierboven werd benoemd: Expansie kun je min-of-meer vermijden door gebruik te maken van dubbele aanhalingstekens. Die muis heeft echter nog een staartje:

# Dit werkt prima
#
pad="/var/www/example.com"
sudo chmod -v 770 $pad

Maar nu wil ik iets doen met de bestanden in die map:

# Dit werkt niet
#
pad="/var/www/example.com"
sudo chmod -v 770 $pad"/*"

Tijdens executie wordt de variabele geëxpandeerd tot sudo chmod -v 770 /var/www/example.com/* en dat werkt niet: /* moet wél geëxpandeerd worden voor chmod om er iets mee te kunnen.

Wat wel werkt:

# Dit werkt
#
pad="/var/www/example.com"
sudo chmod -v 770 $pad/*

Wat ook werkt, zij het wat indirecter:

# Dit werkt ook
#
pad="/var/www/example.com"
tmp=$pad"/*"
sudo chmod -v 770 $tmp

In beide gevallen wordt $tmp geëxpandeerd zoals bedoeld.

Zie ook

Dit hoofdstuk is eigenlijk een inleiding op parameter substitution. Zie Parameter Substitution (Bash) voor details.

Bronnen