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.

Terminology

[1]:

  • Declare: When you declare a variable, you give its name and maybe its type. For compiled languages, declaring is often compulsory, and associated memory is reserved for it
  • Type: The type of a variable indicates what kind of data it can contain, like integer, string, etc. I'm not sure if non-scalar data is also called a type - I will use it like that anyway
  • Assign: When you give a variable a value, it's called assigning.

Extra:

  • I think that instantiation means that you create a new copy of an object (like in object orientation)
  • I don't know what initialisation means.

Variable names

  • Don't use all-caps variable names: They are reserved for system usage [2]

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