Kurz: Zum Ausprobieren nutzen wir set —, das die Argumente der Shell setzt:
Teil des Kurses Bash
Skript-Argumente
| Variable | Bedeutung |
|---|---|
$0 | Name des Skripts |
$1, $2, … | erstes, zweites Argument |
$# | Anzahl der Argumente |
"$@" | alle Argumente, einzeln gequotet (fast immer richtig) |
"$*" | alle Argumente als ein String |
shift | schiebt 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]" "$*"; echoAusgabe:
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² = 81Achtung
Ohne
localsind Variablen in Funktionen global.returnliefert nur Zahlen von 0 bis 255 (Status); Werte gibst du perechozurü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 -hAusgabe:
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 / bFunktionen 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 geladenMerke
- Argumente:
$1,$#,"$@",shift; Optionen mitgetopts - Funktionen:
name() { ... },localfür lokale Variablen returnliefert den Status (0 bis 255), Werte perechound$(...)sourcelädt eine Bibliothek- Verwende
"$@"statt$*
Übungsaufgabe
Schreibe eine Funktion maximum, die das größte ihrer Argumente ausgibt.
Quiz zur Selbstkontrolle
Was ist "$@"?
- Alle Argumente, einzeln gequotet (richtig)
- Das letzte Argument
- Die Anzahl der Argumente
- Der Skriptname
Wie gibt eine Funktion einen Textwert zurück?
- Per echo, aufgefangen mit $(…) (richtig)
- Mit return “text”
- Mit print
- Mit export
Wozu dient local?
- Variable nur innerhalb der Funktion (richtig)
- Variable für alle Programme
- Datei lokal speichern
- Lokales Netzwerk
Weiter im Kurs
Zurück: Schleifen
Weiter: Arrays, Maps und String-Operationen
Alle Kapitel: Bash im Überblick