Variablen Substitutionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Variablen allgemein

  • In der Bash-Shell können Variablen verwendet werden, um Daten zu speichern und auf sie zuzugreifen.
  • Eine Variable wird mit einem Namen definiert und kann einen beliebigen Wert enthalten, z. B. eine Zeichenkette, eine Zahl oder eine Liste von Werten.
  • Variablen in Bash werden ohne Typdeklaration erstellt und können jederzeit neu zugewiesen werden.
  • Der Wert einer Variablen wird mit dem Zuweisungsoperator = festgelegt und durch den Variablennamen abgerufen.
  • Es gibt auch vordefinierte Umgebungsvariablen, die Informationen über das System oder die Shell enthalten (z. B. Benutzername, Arbeitsverzeichnis, Hostname).
  • Variablen können in Befehlen und Skripten verwendet werden, um die Flexibilität und Wiederverwendbarkeit von Code zu verbessern.

Skalare Variablen

  • Eine Variable stellt einen Platzhalter dar.
  • Man spricht von Variablensubstitution, wenn anstelle der Variablen deren Wert ausgegeben wird.
  • Eine Variable muss – im Gegensatz zu kompilierten Sprachen – nicht deklariert werden.
  • Der Interpreter allokiert den Speicherplatz zur Laufzeit.
  • Die Definition einer Variablen erfolgt durch Name, gefolgt von = und dem zugewiesenen Wert.
  • Wichtig: Zwischen Variablenname, = und Wert darf kein Leerzeichen stehen.
  • Großbuchstaben werden bevorzugt, Bindestriche sollten vermieden werden.
Definition einer Variablen
  • GLAS=bier
Ausgabe des Variableninhalts
  • echo $GLAS
bier  
Beispiel einer Variablensubstitution
  • UNIXSYSTEM=/usr
  • ls -ld $UNIXSYSTEM
drwxr-xr-x 11 root root 4096 2008-10-29 23:58 /usr  

Feldvariablen (Arrays)

  • In Bash können Arrays verwendet werden, um mehrere Werte unter einem gemeinsamen Namen zu speichern.
  • Arrays werden über Indizes angesprochen und erlauben den Zugriff auf einzelne Elemente.
Definition
  • farbe=(blau gelb gruen rot)
Ausgabe einzelner Elemente
  • echo ${farbe[0]} → blau
  • echo ${farbe[1]} → gelb
  • echo ${farbe[2]} → gruen
  • echo ${farbe[3]} → rot

Assoziative Arrays

  • Assoziative Arrays sind Schlüssel/Wert-Paare und werden ab Bash 4 unterstützt.
  • Sie werden mit declare -A deklariert.
  • Der Zugriff erfolgt über den Schlüssel: ${array[key]}
#!/bin/bash
declare -A fruits
fruits["apple"]="red"
fruits["banana"]="yellow"
fruits["orange"]="orange"

echo ${fruits["apple"]}

fruits["grape"]="purple"

for key in "${!fruits[@]}"; do
  echo "$key is ${fruits[$key]}"
done

Der Exportbefehl

  • Variablen werden nicht automatisch an Kindprozesse weitergegeben.
  • Mit export werden sie in die Prozessumgebung übernommen und beim Forken vererbt.
  • Alle exportierten Variablen können mit printenv oder env angezeigt werden.
  • Alle Shellvariablen (auch nicht exportierte) werden mit set angezeigt.

Kommandosubstitution

  • Die Kommandosubstitution ermöglicht, den Ausgabewert eines Befehls in einer Variablen zu speichern oder in einen anderen Befehl einzufügen.
  • Zwei Varianten:
    • $(Befehl) – moderne Variante, unterstützt Schachtelung
    • `Befehl` – ältere Variante (Backticks)
Beispiele
  • cd $(echo /home/$(whoami))
  • cd `echo /home/$(whoami)`
  • MOMENT=$(date -u "+%X")
  • echo $MOMENT → 09:29:58

Abgrenzen von Variablen

  • Ein Dollarzeichen $ leitet eine Variablenreferenz oder Parameterexpansion ein.
  • Geschweifte Klammern ${...} dienen zur Gruppierung.
Beispiele
  • SUX=eins
  • TUX=zwei
  • SUXTUX=drei
  • echo $SUX → eins
  • echo ${SUX}TUX → einsTUX
  • echo ${SUX}${TUX} → einszwei

Weitere Mechanismen zur Parameterexpansion

  • Diese Mechanismen manipulieren Variableninhalte.
  • FARBE steht für den Variablennamen, rot für eine Zeichenkette oder andere Variable.
Beispiele
  • ${FARBE:-rot} – Standardwert, wenn nicht gesetzt
  • ${FARBE:=rot} – wie oben, zusätzlich wird FARBE belegt
  • ${FARBE:?keine farbe} – Fehlermeldung, wenn FARBE nicht definiert
  • ${FARBE:+rot} – liefert „rot“, wenn FARBE definiert ist
  • ${FARBE:3} – Ausgabe ab Position 3
  • ${FARBE:5:3} – Ausgabe von 3 Zeichen ab Position 5
  • ${#FARBE} – Länge der Variablen
  • ${FARBE#rot} – entfernt „rot“ am Anfang
  • ${PROGRAM##*/} – entfernt längstmöglich alles bis zum letzten Slash
  • ${FARBE%weis} – entfernt „weis“ am Ende
  • ${FARBE%%o*} – entfernt längstmöglich ab „o“
  • ${FARBE/rot/blau} – ersetzt erstes „rot“ durch „blau“
  • ${FARBE//rot/blau} – ersetzt alle „rot“ durch „blau“

Wichtige Systemvariablen (Auswahl)

PATH

Pfad, in dem nach ausführbaren Programmen gesucht wird

HOME

Heimatverzeichnis

BASH

Pfadname der aktuellen Shell

PWD

Aktuelles Verzeichnis

OLDPWD

Vorheriges Verzeichnis

PS1, PS2, PS3

Eingabeprompts 1–3

UID

Benutzerkennung

EDITOR

Standardeditor (meist vi)

MAIL

Pfad zum Postfach

HOSTNAME

Name des Rechners

Stellungsparameter (spezielle Variablen)

  • Den Stellungsparametern $1, $2, …, $9 werden bei der Definition Werte nach ihrer Reihenfolge zugewiesen.
  • Der Geltungsbereich ist lokal – sie gelten nur in der aktuellen Bash und können nicht exportiert werden.
Belegen mittels set
  • set der fck ist eine klasse Mannschaft
  • echo $1 $2 $3 → der fck ist
  • echo $5 $6 $7 → eine klasse Mannschaft
  • set unser fcs ist aber auch ok
  • echo $1 $2 $3 → unser fcs ist
Belegen durch Skriptaufruf
  • cat skript1
#!/bin/bash
echo "1. Parameter $1"
echo "2. Parameter $2"
echo "3. Parameter $3"
echo "4. Parameter $4"
echo "alle Parameter $*"
echo "alle Parameter $@"
echo "Anzahl Parameter $#"
echo "Skriptname $0"
echo "PID des Skripts $$"
echo "Rückgabewert letztes Kommando $?"
  • ./skript1 blau gruen gelb rot

Systemparameter

$$ PID des laufenden Prozesses
$! PID des letzten Hintergrundprozesses
$- Liste der für die Bash gesetzten Optionen
$? Exit-Status des letzten Kommandos
$# Anzahl der Stellungsparameter
$* Liste aller Stellungsparameter
$0 Aktueller Prozessname

shift-Kommando

  • Verschiebt alle Stellungsparameter um eine Stelle nach links.
Beispiel
  • set hallo ihr guten admins von der schule hier
  • echo $1 $2 $3 $4 → hallo ihr guten admins
  • shift
  • echo $1 $2 $3 $4 → ihr guten admins von
  • shift 3
  • echo $1 $2 $3 $4 → von der schule hier

Aufgaben

Skalare Variablen

  • Ordnen Sie der Variablen GLAS den Wert bier zu.
  • Geben Sie den Wert der Variablen aus.
  • Ordnen Sie einer beliebigen Variablen den Pfad zu einem Verzeichnis zu.
  • Lassen Sie sich über den Variablenwert den Inhalt dieses Verzeichnisses anzeigen.

Feldvariablen

  • Ordnen Sie der Variablen FARBE die Werte schwarz, rot und gold zu.
  • Geben Sie jeden Wert einzeln aus.

Kommandosubstitution

  • Definieren Sie den Begriff Kommandosubstitution.
  • Nennen Sie beide Varianten der Kommandosubstitution.
  • Was ist der Unterschied?
  • Ordnen Sie die Ausgabe von date einer beliebigen Variablen zu.
  • Wie kann man mit whoami in sein Home-Verzeichnis wechseln?

Abgrenzen von Variablen (Parameterexpansion)

  • Definieren Sie drei Variablen, wobei die dritte sich aus den ersten beiden zusammensetzt (z. B. SUX, TUX, SUXTUX).
  • Geben Sie diese Variablen in allen Abgrenzungsformen wieder.

Weitere Mechanismen zur Parameterexpansion

Beschreibe, was bei folgenden Parameterexpansionen passiert
  • echo ${FARBE:-rot}
  • echo ${FARBE:=rot}
  • echo ${FARBE:?keine farbe}
  • echo ${FARBE:+rot}
  • echo ${FARBE:3}
  • echo ${FARBE:5:3}
  • echo ${#FARBE}
  • echo ${FARBE#rot}
  • echo ${PROGRAM#*/}
  • echo ${FARBE%weis}
  • echo ${FARBE%o*}
  • echo ${FARBE/rot/blau}