5.3 Argumente

In diesem Lab lernen wir Argumente kennen.

Inhalt

Was sind Argumente

Argumente sind bestimmte Konfigurationen, welche einem Script oder auch einer Funktion innerhalb eines Scripts übergeben werden und das Verhalten des Scripts / der Funktion steuern. Du hast Argumente im Lab 1 bereits verwendet, z.B. indem du das Kommando ls mit dem Argument -l angewiesen hast, die Dateien und Ordner in einem Verzeichnis als Liste anzuzeigen. Solche Argumente können auch in eigenen Scripts verwendet werden.

Wie verwende ich Argumente

Die Verwendung von Argumenten unterscheidet sich bei Bash und Python erheblich. Wir schauen uns zuerst an, wie wir Argumente in einem Bash Script verwenden können. Grundsätzlich unterscheiden wir dabei zwischen sogenannten positional parameters und flags

Bash: positional parameters

Auf positional parameters kann in Bash über die speziellen Variablen $0 bis $9 zugegriffen werden. Die Variable $0 enthält dabei den Pfad zum ausgeführten Script, während in den Variablen $1 bis $9 die ersten 1-9 Parameter enthalten:

./script.sh

1
2
3
4
5
#!/bin/env bash
echo $0
echo $1
echo $2
echo $3
1
2
3
4
5
6
chmod +x ./script.sh
[user@host]$  ./script.sh first_param second_param third_param
./script.sh
first_param
second_param
third_param

Zusätzlich stehen noch die Variablen $* und $@ zur Verfügung, welche sämtliche übergebenen Parameter enthalten. In $* stehen die einzelnen Parameter in einem einzelnen String (durch Leerzeichen getrennt), während in $@ die Parameter in Form eines Arrays geführt werden.

Bash: Flags

Flags (-a -b usw.) können ebenfalls einem Bash Script übergeben werden. Allerdings müssen die Flags dazu im Script entsprechend geparst werden. Hierfür gibt es die integrierte Funktion getopts:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
while getopts u:a:f: flag
do
    case "${flag}" in
        u) username=${OPTARG};;
        a) age=${OPTARG};;
        f) fullname=${OPTARG};;
    esac
done
echo "Username: $username";
echo "Age: $age";
echo "Full Name: $fullname";

https://www.baeldung.com/linux/use-command-line-arguments-in-bash-script#flags

Im obigen Beispielsscript können die flags -a, -f und -u übergeben werden und stehen anschliessend in den entsprechenden Variablen age, fullname und username zur Verfügung.

Python: sys.argv

Ähnlich zu den positional arguments in Bash, lassen sich CLI Parameter in Python Scripts über die argv Funktion des sys Moduls auslesen:

script.py

1
2
3
4
5
6
7
#!/bin/env python
import sys

print(sys.argv[0])
print(sys.argv[1])
print(sys.argv[2])
print(sys.argv[3])
1
2
3
4
5
[user@host]$./script.py  first second third
./script.py
first
second
third

Python: getopts

Ebenso wie bei Bash lassen sich auch Flags verarbeiten. Dazu nutzen wir ein weiteres Python Modul: getopts:

script.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/env python
import getopt
import sys

argv = sys.argv[1:]
opts, args = getopt.getopt(argv, "f:l:")
for opt, arg in opts:
    if opt in ['-f']:
        first_name = arg
    elif opt in ['-l']:
        last_name = arg
print(first_name)
print(last_name)
1
2
3
[user@host]$ ./script.py -f Max -l Muster
Max
Muster

Wie genau das Parsen dieser Argumente funktioniert, ist aktuell zweitrangig. Wir werden im nächsten Lab genauer auf dieses Beispiel eingehen.