5.2 Variablen

In diesem Lab lernen wir, was Variablen sind und wie wir diese in unseren Scripts verwenden können.

Inhalt

Was sind Variablen?

Eine Variable ist ein symbolischer Name für einen bestimmten Wert. In einer Variable können Werte/Daten (Zahlen oder Zeichenketten) gespeichert und anschliessend im Script verwendet werden.

Im folgenden Beispiele deklarieren wir eine Variable mit dem Namen filename und weisen dieser Variable den Wert example.yml zu. Anschliessend geben wir den Wert der Variable aus.

Bash:

1
2
filename="example.yml"
echo ${filename}

Python:

1
2
filename = "example.yml"
print(filename)

Bei der Verwendung von Variablen macht es Sinn, sich an eine naming convention zu halten. Umgebungsvariablen (siehe Lab 1) werden grundsätzlich immer grossgeschrieben (z.B: USER). Für Variablen in einem Script ist es daher sinnvoll, diese kleinzuschreiben. Weiter müssen Variablen, welche aus mehreren Wörtern bestehen entweder zusammengeschrieben (camelCase) oder durch einen _ (snake_case) getrennt werden. Auch hier sollte eine Variante gewählt und anschliessend im gesamten Script verwendet werden (camelCase und snake_case nicht mischen)

Arrays und Listen

In beiden Beispielen haben wir einer Variable jeweils nur einen einzigen Wert zugewiesen. Es gibt jedoch auch Anwendungsfälle, bei welchen man einer Variable mehrere Werte zuweisen möchte. Angenommen, du möchtest in einer Variable mehrere Vornamen speichern. Eine Möglichkeit wäre natürlich, diese Vornamen z.B. kommagetrennt zu speichern:

1
firstnames="Alice,Bob"

Python:

1
firstnames = "Alice,Bob"

Das würde zwar theoretisch funktionieren, bringt jedoch neue Probleme, weil wir bei der Verarbeitung dieser Variable die einzelnen Namen wieder aufsplitten müssen. In einem solchen Fall helfen Arrays (Bash) und Listen (Python) weiter. Ein Array/Liste funktioniert ähnlich wie eine Variable, mit dem Unterschied, dass darin mehrere Werte gespeichert werden können:

1
firstnames=("Alice" "Bob")

Python:

1
firstnames = ["Alice", "Bob"]

Hinweis: wenn du in einem Bash Script an den Punkt kommst, wo du Arrays einsetzen musst, macht es meist Sinn, das Script nicht in Bash sondern in Python zu schreiben. In Python gibt es neben einfachen Listen auch noch weitere Datentypen, in welchen Daten strukturiert gespeichert und verarbeitet werden können.

Variablen in Scripts verwenden

Variable deklarieren und zuweisen:

Bash

1
vorname="max"

Python

1
vorname = "max"
Auf Variable zugreifen:

Bash

1
$vorname

Python

1
vorname
Variable “löschen”

Bash

1
unset vorname

Python

1
del vorname
Variablennamen abgrenzen:

Soll der Variablenname innerhalb eines Strings verwendet werden, muss dieser mit geschweiften Klammern abgegrenzt werden:

Bash

1
2
backup=".bak"
echo "example${backup}.yml"

In Python können dazu die sogenannten f-Strings verwendet werden:

Python

1
2
backup = ".bak"
print(f"example{backup}.yml")
Nicht definierte Variablen

In einem Script sollte stets darauf geachtet werden, dass sämtliche verwendeten Variablen auch wirklich definiert sind. In Bash ist die Verwendung einer undefinierten Variable standardmässig kein Fehler, dein Script läuft also weiter. Das kann zu Problem führen und man sollte daher die Bash so konfigurieren, dass bei der Verwendung einer undefinierten Variable ein Fehler entsteht und sich das Script beendet. Um das zu erreichen, nutzen wir den set Befehl:

1
2
3
[user@host]$ set -u
[user@host]$ echo $undefined_variable
bash: undefined_variable: unbound variable

Aus der manpage von set:

Treat unset variables and parameters other than the special parameters "@" and "*", or  array variables subscripted with "@" or "*", as an error when performing parameter expansion. If expansion is attempted on an unset variable or parameter, the shell prints an error message, and, if not interactive, exits with a non-zero status.

Ein Python Script schlägt standardmässig fehl, wenn auf eine nicht definierte Variable zugewiesen wird:

1
2
3
4
>>> print(undefined_variable)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'undefined_variable' is not defined

Beispiel

Nun, da wir uns mit einer Einführung ins Scripting sowie den Variablen beschäftigt haben, erstellen wir ein erstes kleines Script, welches den User nach Vor- und Nachname fragt und diese anschliessend zurückgibt. Im Bash Script verwenden wir dazu das read Kommando und bei der Python Version die input Funktion

Bash

1
2
3
4
5
6
7
#!/bin/env bash
echo "Enter your firstname:"
read firstname
echo "Enter your lastname:"
read lastname

echo "Hello ${firstname} ${lastname}!"
1
2
3
4
#!/bin/env python
firstname = input("Enter your firstname: ")
lastname = input("Enter your lastname: ")
print(f"Hello {firstname} {lastname}")

Was sind Datentypen

Ein Datentyp in einer Programmiersprache definiert, welche Art von Daten sich in einer Variable befinden. Man unterscheidet dabei zwischen stark und schwach typisierten Sprachen.

starke Typisierung

In einer stark typisierten Sprache wie Python ist es wichtig, dass die Variablen den korrekten Datentyp besitzen. Folgendes Codebeispiel generiert einen Fehler:

1
2
3
4
5
6
>>> operand_a = 1
>>> operand_b = "2"
>>> operand_a + operand_b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Der TypeError informiert uns darüber, dass wir versucht haben, eine Variable mit dem Datentyp int (operand_a) mit einer Variable eines anderen Datentyp str (operand_b) zu addieren. Da wir bei der Deklaration der Variable operand_b Anführungszeichen verwenden, wird dieser Variable automatisch der Datentyp str zugewiesen. Um das Problem zu lösen, müssen beide Variablen den gleich Datentyp besitzen:

Beispiel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
>>> operand_a = 1
>>> operand_b = 2
>>> operand_a + operand_b
3

# oder auch möglich:

>>> operand_a = "1"
>>> operand_b = "2"
>>> operand_a + operand_b
'12'

Das Resultat 3 der ersten Berechnung entspricht unserer Erwartung einer Addition. Im zweiten Beispiel werden beide Variablen als String definiert. In diesem Fall “addiert” Python, indem es die Werte beider Variablen hintereinander reiht. Das Resultat dieser Operation ist ein str.

statische / dynamische Typisierung

Zusätzlich zur Unterscheidung von stark/schwach typisiert gibt es jeweils noch Unterkategorien für dynamische und statische Typisierung. In einer statisch typisierten Sprache wie Java, wird beim Deklarieren der Variable der Datentyp definiert. Dieser kann sich anschliessend nicht mehr ändern.

Beispiel (statische Typisierung)

1
2
String name = "John";
name = 5;

Fehler:

1
2
3
4
Main.java:4: error: incompatible types: int cannot be converted to String
    name = 5;
           ^
1 error

Im Gegensatz dazu kann sich bei Python der Datentyp einer Variable auch nach deren Deklaration noch ändern.

Beispiel (dynamische Typisierung)

1
2
3
4
>>> name = "John"
>>> name = 5
>>> print(name)
5

schwache Typisierung

Sprachen wie Bash, Javascript oder PHP zählen zu den schwach typisierten Sprachen. Die Variablen haben hier keinen resp. alle den gleich Typ.

1
2
3
4
[user@host]$ operand_a="1"
[user@host]$ operand_b=2
[user@host]$ echo $(( operand_a + operand_b ))
3