Bash Variablen: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
| (16 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
=Variablen allgemein= | = Variablen allgemein = | ||
*In der Bash-Shell können Variablen verwendet werden, um Daten zu speichern und auf sie zuzugreifen. | * 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, | * 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 in der Regel ohne explizite Typdeklaration erstellt und können jederzeit neu zugewiesen werden. | * Variablen in Bash werden in der Regel ohne explizite Typdeklaration erstellt und können jederzeit neu zugewiesen werden. | ||
*Der Wert einer Variable kann mithilfe des Zuweisungsoperators | * Der Wert einer Variable kann mithilfe des Zuweisungsoperators '''=''' festgelegt und durch den Variablennamen abgerufen werden. | ||
*Es gibt auch vordefinierte Umgebungsvariablen in Bash, die Informationen über das System oder die Shell selbst enthalten, | * Es gibt auch vordefinierte Umgebungsvariablen in Bash, die Informationen über das System oder die Shell selbst enthalten (z. B. Benutzername, aktuelles Arbeitsverzeichnis oder Hostname). | ||
*Variablen können in Befehlen und Skripten verwendet werden, um die Flexibilität und Wiederverwendbarkeit von Code zu verbessern | * Variablen können in Befehlen und Skripten verwendet werden, um die Flexibilität und Wiederverwendbarkeit von Code zu verbessern. | ||
*Die Definition einer Variablen erfolgt durch | = Skalare Variablen = | ||
*Wichtig : | * 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 Programmiersprachen – nicht deklariert werden. | |||
* Der Interpreter allokiert den Speicherplatz zur Laufzeit. | |||
* Die Definition einer Variablen erfolgt durch Nennung, gefolgt von '''=''' und dem zugewiesenen Wert. | |||
* Wichtig: Zwischen Variablenname, '''=''' und Wert darf kein Leerzeichen stehen. | |||
* Es werden häufig Großbuchstaben verwendet; Bindestriche sollten vermieden werden. | |||
== Definition einer Variablen == | |||
==Definition | * '''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 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)''' | |||
== 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]}'''. | |||
<syntaxhighlight lang=bash> | |||
#!/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 | |||
</syntaxhighlight> | |||
* | = Der Exportbefehl = | ||
* Variablen werden nicht automatisch an Kindprozesse weitergegeben. | |||
* Mit '''export''' werden sie in die Prozessumgebung übernommen, um beim Forken auch im Kindprozess verfügbar zu sein. | |||
* 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))''' | ||
*echo | * '''cd `echo /home/`whoami``` | ||
* '''MOMENT=$(date -u "+%X")''' | |||
* | * '''echo $MOMENT''' → 09:29:58 | ||
*echo $ | |||
= 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 dabei 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) = | |||
=Wichtige Systemvariablen (Auswahl)= | |||
; PATH | ; PATH | ||
Pfad, in dem nach ausführbaren Programmen gesucht wird | Pfad, in dem nach ausführbaren Programmen gesucht wird | ||
; HOME | ; HOME | ||
Heimatverzeichnis | Heimatverzeichnis | ||
; BASH | ; BASH | ||
Pfadname der aktuellen Shell | Pfadname der aktuellen Shell | ||
; PWD | ; PWD | ||
Aktuelles Verzeichnis | Aktuelles Verzeichnis | ||
; OLDPWD | ; OLDPWD | ||
Vorheriges Verzeichnis | |||
; PS1 ,PS2 , PS3 | ; PS1, PS2, PS3 | ||
Eingabeprompts 1 – 3 | |||
; UID | ; UID | ||
Benutzerkennung | Benutzerkennung | ||
; EDITOR | ; EDITOR | ||
Standardeditor ( | Standardeditor (meist vi) | ||
; MAIL | ; MAIL | ||
Pfad zum Postfach | |||
; HOSTNAME | ; HOSTNAME | ||
Name des Rechners | 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 | == Belegen mittels set == | ||
*set der fck ist eine klasse Mannschaft | * '''set der fck ist eine klasse Mannschaft''' | ||
*echo $1 $2 $3 | * '''echo $1 $2 $3''' → der fck ist | ||
* '''echo $5 $6 $7''' → eine klasse Mannschaft | |||
*echo $5 $6 $7 | * '''set unser fcs ist aber auch ok''' | ||
* '''echo $1 $2 $3''' → unser fcs ist | |||
*set unser fcs ist aber auch ok | |||
*echo $1 $2 $3 | |||
==Belegen | == Belegen durch Skriptaufruf == | ||
* '''cat skript1''' | |||
*cat skript1 | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
#!/bin/bash | #!/bin/bash | ||
echo "1 | echo "1. Parameter $1" | ||
echo "2 | echo "2. Parameter $2" | ||
echo "3 | echo "3. Parameter $3" | ||
echo "4 | echo "4. Parameter $4" | ||
echo "alle | echo "alle Parameter $*" | ||
echo "alle | echo "alle Parameter $@" | ||
echo " | echo "Anzahl Parameter $#" | ||
echo " | echo "Skriptname $0" | ||
echo "PID des | echo "PID des Skripts $$" | ||
echo "Rückgabewert letztes Kommando | echo "Rückgabewert letztes Kommando $?" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* '''./skript1 blau gruen gelb rot''' | |||
= Systemparameter = | |||
{| border=1 cellpadding="2" | {| border=1 cellpadding="2" | ||
| $$ | | $$ | ||
| Zeile 291: | Zeile 172: | ||
|- | |- | ||
| $- | | $- | ||
| Liste der für die | | Liste der für die Bash gesetzten Optionen | ||
|- | |- | ||
| $? | | $? | ||
| | | Exit-Status des letzten Kommandos | ||
|- | |- | ||
| $# | | $# | ||
| Anzahl der Stellungsparameter | | Anzahl der Stellungsparameter | ||
|- | |- | ||
| $* | | $* | ||
| Liste | | Liste aller Stellungsparameter | ||
|- | |- | ||
| $0 | | $0 | ||
| Zeile 306: | Zeile 187: | ||
|} | |} | ||
= 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 == | ||
*echo $ | ; Beschreiben Sie, was bei folgenden Parameterexpansionen passiert: | ||
* '''echo ${FARBE:-rot}''' | |||
* | * '''echo ${FARBE:=rot}''' | ||
*echo $ | * '''echo ${FARBE:?keine farbe}''' | ||
* '''echo ${FARBE:+rot}''' | |||
* | * '''echo ${FARBE:3}''' | ||
*echo $ | * '''echo ${FARBE:5:3}''' | ||
* '''echo ${#FARBE}''' | |||
* '''echo ${FARBE#rot}''' | |||
* '''echo ${PROGRAM#*/}''' | |||
* '''echo ${FARBE%weis}''' | |||
* '''echo ${FARBE%o*}''' | |||
* '''echo ${FARBE/rot/blau}''' | |||
Aktuelle Version vom 12. Oktober 2025, 21:29 Uhr
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 in der Regel ohne explizite Typdeklaration erstellt und können jederzeit neu zugewiesen werden.
- Der Wert einer Variable kann mithilfe des Zuweisungsoperators = festgelegt und durch den Variablennamen abgerufen werden.
- Es gibt auch vordefinierte Umgebungsvariablen in Bash, die Informationen über das System oder die Shell selbst enthalten (z. B. Benutzername, aktuelles Arbeitsverzeichnis oder 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 Programmiersprachen – nicht deklariert werden.
- Der Interpreter allokiert den Speicherplatz zur Laufzeit.
- Die Definition einer Variablen erfolgt durch Nennung, gefolgt von = und dem zugewiesenen Wert.
- Wichtig: Zwischen Variablenname, = und Wert darf kein Leerzeichen stehen.
- Es werden häufig Großbuchstaben verwendet; 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 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)
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
Der Exportbefehl
- Variablen werden nicht automatisch an Kindprozesse weitergegeben.
- Mit export werden sie in die Prozessumgebung übernommen, um beim Forken auch im Kindprozess verfügbar zu sein.
- 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 dabei 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)
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
- 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}