Variabelen (Bash)
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:
- De variabele wordt geëxpandeerd voordat het commando wordt uitgevoerd. Dus
echo $i
wordt eerstecho foo bar
- 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.