Variablen-Substitutionen: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „= Variablen allgemein = *In der Bash-Shell können Variablen verwendet werden, um Daten zu speichern und auf sie zuzugreifen. *Eine Variable wird mit einem N…“)
 
 
(9 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
= Variablen allgemein =
+
= Variablen-Substitution =
*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 =
+
== Was ist eine Variablen-Substitution ==
*Eine Variable stellt einen Platzhalter dar. 
+
*Unter Variablen-Substitution versteht man das Ersetzen eines Variablennamens durch seinen aktuellen Wert.   
*Man spricht von Variablensubstitution, wenn anstelle der Variablen deren Wert ausgegeben wird.   
+
*Dies geschieht zur Laufzeit durch die Shell, bevor der Befehl tatsächlich ausgeführt wird.   
*Eine Variable muss – im Gegensatz zu kompilierten Sprachen – nicht deklariert werden. 
+
*Variablen dienen der Speicherung und Wiederverwendung von Werten, z. B. Texten, Zahlen oder Pfaden.   
*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
+
== Definition und Zuweisung ==
*GLAS=bier  
+
*Variablen werden in Bash ohne Datentypen definiert. 
 +
*Eine Zuweisung erfolgt durch ein Gleichheitszeichen ohne Leerzeichen.  
  
;Ausgabe des Variableninhalts
+
;Beispiele
*echo $GLAS   
+
* GLAS=bier  
bier  
+
* ORDNER=/etc  
  
;Beispiel einer Variablensubstitution
+
== Ausgabe von Variablen ==
*UNIXSYSTEM=/usr 
+
*Zur Ausgabe des Inhalts einer Variablen wird vor ihren Namen ein Dollarzeichen ($) gesetzt.  
*ls -ld $UNIXSYSTEM  
+
*Die Shell ersetzt den Variablennamen durch dessen Wert.  
drwxr-xr-x 11 root root 4096 2008-10-29 23:58 /usr  
 
  
 +
;Beispiele
 +
* echo $GLAS → bier 
 +
* echo $ORDNER → /etc 
 +
 +
== Verwendung in Befehlen ==
 +
*Variablen können direkt in Befehlen eingesetzt werden. 
 +
*Die Shell ersetzt dabei die Variable durch ihren Wert, bevor der Befehl ausgeführt wird. 
 +
 +
;Beispiel
 +
* UNIXSYSTEM=/usr 
 +
* ls -ld $UNIXSYSTEM 
 +
drwxr-xr-x 11 root root 4096 /usr 
 +
 +
== Substitution mit geschweiften Klammern ==
 +
*Zur eindeutigen Abgrenzung von Variablen in komplexen Ausdrücken werden geschweifte Klammern verwendet. 
 +
*Dies ist vor allem dann nötig, wenn Zeichen direkt an den Variablennamen anschließen. 
 +
 +
;Beispiele
 +
* SUX=eins 
 +
* TUX=zwei 
 +
* SUXTUX=drei 
 +
* echo $SUXTUX → drei 
 +
* echo ${SUX}TUX → einsTUX 
 +
* echo ${SUX}${TUX} → einszwei 
 +
 +
== Erweiterte Parameterexpansion ==
 +
*Mit Hilfe der Parameterexpansion können Variableninhalte geprüft, verändert oder ergänzt werden. 
 +
*Diese Mechanismen werden direkt von der Shell verarbeitet und sind sehr effizient. 
 +
 +
;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“
 
= Feldvariablen (Arrays) =
 
= Feldvariablen (Arrays) =
*In Bash können Arrays verwendet werden, um mehrere Werte unter einem gemeinsamen Namen zu speichern.
+
* In Bash können Feldvariablen (Arrays) verwendet werden, um mehrere Werte unter einem gemeinsamen Namen zu speichern.
*Arrays werden über Indizes angesprochen und erlauben den Zugriff auf einzelne Elemente.
+
* Arrays werden über Indizes angesprochen und erlauben den Zugriff auf mehrere Elemente innerhalb einer Variablen.
  
;Definition
+
== Definition ==
*farbe=(blau gelb gruen rot)
+
* '''farbe=(blau gelb gruen rot)'''
  
;Ausgabe einzelner Elemente
+
==Defnition einer Wertes ==
*echo ${farbe[0]} → blau 
+
* '''farbe[4]=silber'''
*echo ${farbe[1]} → gelb 
 
*echo ${farbe[2]} → gruen 
 
*echo ${farbe[3]} → rot 
 
  
 +
== Ausgabe einzelner Elemente ==
 +
* '''echo ${farbe[0]}''' → blau 
 +
* '''echo ${farbe[1]}''' → gelb 
 +
* '''echo ${farbe[2]}''' → gruen 
 +
* '''echo ${farbe[3]}''' → rot
 
= Assoziative Arrays =
 
= Assoziative Arrays =
*Assoziative Arrays sind Schlüssel/Wert-Paare und werden ab Bash 4 unterstützt.
+
* Assoziative Arrays sind Schlüssel/Wert-Paare und werden ab Bash 4 unterstützt.
*Sie werden mit declare -A deklariert.
+
* Sie werden mit '''declare -A''' deklariert.
*Der Zugriff erfolgt über den Schlüssel: ${array[key]}
+
* Zugriff erfolgt über den Schlüssel: '''${array[key]}'''.
  
<syntaxhighlight lang="bash">
+
<syntaxhighlight lang=bash>
 
#!/bin/bash
 
#!/bin/bash
 
declare -A fruits
 
declare -A fruits
Zeile 62: Zeile 97:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
= Der Exportbefehl =
+
= Wichtige Hinweise =
*Variablen werden nicht automatisch an Kindprozesse weitergegeben.   
+
*Zwischen Variablenname, Gleichheitszeichen und Wert dürfen keine Leerzeichen stehen.   
*Mit export werden sie in die Prozessumgebung übernommen und beim Forken vererbt. 
+
*Großbuchstaben werden oft für benutzerdefinierte Variablen verwendet.   
*Alle exportierten Variablen können mit printenv oder env angezeigt werden.   
+
*Bash führt die Substitution vor der Ausführung eines Befehls durch.   
*Alle Shellvariablen (auch nicht exportierte) werden mit set angezeigt. 
+
*Nicht gesetzte Variablen werden durch einen leeren String ersetzt.   
 
 
= 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 
 
<syntaxhighlight lang="bash">
 
#!/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 $?"
 
</syntaxhighlight>
 
 
 
*./skript1 blau gruen gelb rot 
 
 
 
= Systemparameter =
 
{| border=1 cellpadding="2"
 
| $$
 
| 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 =
 
= Aufgaben =
  
== Skalare Variablen ==
+
*Definieren Sie eine Variable '''NAME''' mit einem beliebigen Wert und geben Sie diesen mit '''echo''' aus.   
*Ordnen Sie der Variablen GLAS den Wert bier zu.   
+
*Definieren Sie eine Variable '''VERZ''' mit einem Pfad und lassen Sie mit '''ls -l $VERZ''' deren Inhalt anzeigen.   
*Geben Sie den Wert der Variablen aus.   
+
*Erstellen Sie zwei Variablen und kombinieren Sie sie in einer dritten Variablen.   
*Ordnen Sie einer beliebigen Variablen den Pfad zu einem Verzeichnis zu.   
+
*Testen Sie den Unterschied zwischen '''$VARI''' und '''${VARI}TEXT'''.   
*Lassen Sie sich über den Variablenwert den Inhalt dieses Verzeichnisses anzeigen.   
+
*Erklären Sie die Funktionsweise von '''${FARBE:-rot}''' und '''${FARBE:=rot}'''.   
 
+
*Erstellen Sie ein Beispiel, bei dem '''${PROGRAM##*/}''' den Dateinamen aus einem Pfad extrahiert.
== Feldvariablen ==
+
*Erstellen Sie ein Array '''ZAHLEN''' mit mindestens fünf Elementen und geben Sie das dritte Element aus.
*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 ein Array '''FARBEN''' und geben Sie die Anzahl der Elemente mit '''${#FARBEN[@]}''' aus.
*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 ==
+
*Legen Sie ein assoziatives Array '''person''' an (z. B. '''person["name"]="Tom"''', '''person["stadt"]="Berlin"''') und geben Sie beide Werte einzeln aus, ohne Schleifen zu verwenden.
;Beschreiben Sie, 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}
 

Aktuelle Version vom 24. November 2025, 17:30 Uhr

Variablen-Substitution

Was ist eine Variablen-Substitution

  • Unter Variablen-Substitution versteht man das Ersetzen eines Variablennamens durch seinen aktuellen Wert.
  • Dies geschieht zur Laufzeit durch die Shell, bevor der Befehl tatsächlich ausgeführt wird.
  • Variablen dienen der Speicherung und Wiederverwendung von Werten, z. B. Texten, Zahlen oder Pfaden.

Definition und Zuweisung

  • Variablen werden in Bash ohne Datentypen definiert.
  • Eine Zuweisung erfolgt durch ein Gleichheitszeichen ohne Leerzeichen.
Beispiele
  • GLAS=bier
  • ORDNER=/etc

Ausgabe von Variablen

  • Zur Ausgabe des Inhalts einer Variablen wird vor ihren Namen ein Dollarzeichen ($) gesetzt.
  • Die Shell ersetzt den Variablennamen durch dessen Wert.
Beispiele
  • echo $GLAS → bier
  • echo $ORDNER → /etc

Verwendung in Befehlen

  • Variablen können direkt in Befehlen eingesetzt werden.
  • Die Shell ersetzt dabei die Variable durch ihren Wert, bevor der Befehl ausgeführt wird.
Beispiel
  • UNIXSYSTEM=/usr
  • ls -ld $UNIXSYSTEM
drwxr-xr-x 11 root root 4096 /usr  

Substitution mit geschweiften Klammern

  • Zur eindeutigen Abgrenzung von Variablen in komplexen Ausdrücken werden geschweifte Klammern verwendet.
  • Dies ist vor allem dann nötig, wenn Zeichen direkt an den Variablennamen anschließen.
Beispiele
  • SUX=eins
  • TUX=zwei
  • SUXTUX=drei
  • echo $SUXTUX → drei
  • echo ${SUX}TUX → einsTUX
  • echo ${SUX}${TUX} → einszwei

Erweiterte Parameterexpansion

  • Mit Hilfe der Parameterexpansion können Variableninhalte geprüft, verändert oder ergänzt werden.
  • Diese Mechanismen werden direkt von der Shell verarbeitet und sind sehr effizient.
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“

Feldvariablen (Arrays)

  • In Bash können Feldvariablen (Arrays) verwendet werden, um mehrere Werte unter einem gemeinsamen Namen zu speichern.
  • Arrays werden über Indizes angesprochen und erlauben den Zugriff auf mehrere Elemente innerhalb einer Variablen.

Definition

  • farbe=(blau gelb gruen rot)

Defnition einer Wertes

  • farbe[4]=silber

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.
  • 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

Wichtige Hinweise

  • Zwischen Variablenname, Gleichheitszeichen und Wert dürfen keine Leerzeichen stehen.
  • Großbuchstaben werden oft für benutzerdefinierte Variablen verwendet.
  • Bash führt die Substitution vor der Ausführung eines Befehls durch.
  • Nicht gesetzte Variablen werden durch einen leeren String ersetzt.

Aufgaben

  • Definieren Sie eine Variable NAME mit einem beliebigen Wert und geben Sie diesen mit echo aus.
  • Definieren Sie eine Variable VERZ mit einem Pfad und lassen Sie mit ls -l $VERZ deren Inhalt anzeigen.
  • Erstellen Sie zwei Variablen und kombinieren Sie sie in einer dritten Variablen.
  • Testen Sie den Unterschied zwischen $VARI und ${VARI}TEXT.
  • Erklären Sie die Funktionsweise von ${FARBE:-rot} und ${FARBE:=rot}.
  • Erstellen Sie ein Beispiel, bei dem ${PROGRAM##*/} den Dateinamen aus einem Pfad extrahiert.
  • Erstellen Sie ein Array ZAHLEN mit mindestens fünf Elementen und geben Sie das dritte Element aus.
  • Definieren Sie ein Array FARBEN und geben Sie die Anzahl der Elemente mit ${#FARBEN[@]} aus.
  • Legen Sie ein assoziatives Array person an (z. B. person["name"]="Tom", person["stadt"]="Berlin") und geben Sie beide Werte einzeln aus, ohne Schleifen zu verwenden.