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² = 81
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 / 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 mitgetopts - Funktionen:
name() { ... },localfür lokale Variablen returnliefert den Status (0 bis 255), Werte perechound$(...)sourcelädt eine Bibliothek- Verwende
"$@"statt$*
Aufgabe
Schreibe eine Funktion maximum, die das größte ihrer Argumente ausgibt.