EMZETT.
Login

Kurz: Zum Ausprobieren nutzen wir set —, das die Argumente der Shell setzt:

Teil des Kurses Bash

Kapitel 5 von 13 im Kurs Bash. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Skript-Argumente

VariableBedeutung
$0Name des Skripts
$1, $2, …erstes, zweites Argument
$#Anzahl der Argumente
"$@"alle Argumente, einzeln gequotet (fast immer richtig)
"$*"alle Argumente als ein String
shiftschiebt Argumente nach vorn ($2 wird $1)

Zum Ausprobieren nutzen wir set --, das die Argumente der Shell setzt:

set -- "erstes Argument" zweites drittes
echo "Anzahl: $#"
echo "1: $1 | 2: $2"
for a in "$@"; do echo "  [$a]"; done
shift
echo "Nach shift: $1 (Anzahl $#)"
printf "[%s]" "$*"; echo

Ausgabe:

Anzahl: 3
1: erstes Argument | 2: zweites
  [erstes Argument]
  [zweites]
  [drittes]
Nach shift: zweites (Anzahl 2)
[zweites drittes]

Funktionen

Eine Funktion ist ein benannter Block. Sie bekommt Argumente als $1, $2 … und liefert einen Exit-Status (return) oder gibt Text aus (echo), den man mit $(...) einfängt.

gruss() {
    local name="${1:-Welt}"          # local: Variable nur in der Funktion
    echo "Hallo, $name!"
}
 
ist_gerade() {
    (( $1 % 2 == 0 ))                 # Status der Rechnung ist der Rückgabewert
}
 
quadrat() {
    echo $(( $1 * $1 ))
}
 
gruss
gruss "Mia"
if ist_gerade 4; then echo "4 ist gerade"; fi
ist_gerade 7 || echo "7 ist ungerade"
ergebnis=$(quadrat 9)
echo "9² = $ergebnis"

Ausgabe:

Hallo, Welt!
Hallo, Mia!
4 ist gerade
7 ist ungerade
9² = 81

Achtung

Ohne local sind Variablen in Funktionen global. return liefert nur Zahlen von 0 bis 255 (Status); Werte gibst du per echo zurück.

Argumente parsen

nutzung() { echo "Aufruf: skript [-v] [-n NAME] DATEI..."; }
 
parse() {
    local verbose=0 name="Welt" OPTIND opt
    while getopts ":vn:h" opt; do
        case "$opt" in
            v) verbose=1 ;;
            n) name="$OPTARG" ;;
            h) nutzung; return 0 ;;
            :) echo "Option -$OPTARG braucht ein Argument" ;;
            \?) echo "Unbekannte Option -$OPTARG" ;;
        esac
    done
    shift $((OPTIND - 1))
    echo "verbose=$verbose name=$name rest=[$*]"
}
 
parse -v -n Mia datei1 datei2
parse datei
parse -x
parse -h

Ausgabe:

verbose=1 name=Mia rest=[datei1 datei2]
verbose=0 name=Welt rest=[datei]
Unbekannte Option -x
verbose=0 name=Welt rest=[]
Aufruf: skript [-v] [-n NAME] DATEI...

Rekursion und Rückgabewerte

fakultaet() {
    local n=$1
    if (( n <= 1 )); then echo 1; return; fi
    local rest
    rest=$(fakultaet $((n - 1)))
    echo $(( n * rest ))
}
echo "10! = $(fakultaet 10)"
 
summe() {
    local s=0 x
    for x in "$@"; do (( s += x )); done
    echo "$s"
}
echo "Summe: $(summe 1 2 3 4 5)"
 
zwei_werte() { echo "a b"; }
read -r x y < <(zwei_werte)
echo "$x / $y"

Ausgabe:

10! = 3628800
Summe: 15
a / b

Funktionen sammeln: source

Gemeinsame Funktionen legst du in eine Datei (lib.sh) und lädst sie mit source lib.sh oder . lib.sh.

dir=$(mktemp -d)
cat > "$dir/lib.sh" <<'EOF'
LIB_VERSION="1.2"
log() { echo "[LOG] $*"; }
EOF
source "$dir/lib.sh"
log "Bibliothek in Version $LIB_VERSION geladen"

Ausgabe:

[LOG] Bibliothek in Version 1.2 geladen

Merke

  • Argumente: $1, $#, "$@", shift; Optionen mit getopts
  • Funktionen: name() { ... }, local für lokale Variablen
  • return liefert den Status (0 bis 255), Werte per echo und $(...)
  • source lädt eine Bibliothek
  • Verwende "$@" statt $*

Übungsaufgabe

Schreibe eine Funktion maximum, die das größte ihrer Argumente ausgibt.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Schleifen

Weiter: Arrays, Maps und String-Operationen

Alle Kapitel: Bash im Überblick