Bash Variablen: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(9 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, wie zum Beispiel eine Zeichenkette, eine Zahl oder eine Liste von Werten.
+
* 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 "=" festgelegt und durch den Variablennamen abgerufen 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, wie zum Beispiel den Benutzernamen, die aktuelle Arbeitsverzeichnis oder den Hostnamen.
+
* 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, indem sie dynamisch auf verschiedene Eingaben oder Bedingungen reagieren.
+
* 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 anstatt der Variablen deren Wert bzw. Inhalt ausgegeben wird.
 
*Eine Variable muss im Gegensatz zu Programmiersprachen,  die kompiliert werden, nicht deklariert werden.
 
*Der Interpretor allokiert den Speicherplatz zu Laufzeit.  
 
  
*Die Definition einer Variablen erfolgt durch die Nennung, gefolgt von einem = Zeichen, gefolgt von dem Inhalt, der zugewiesen wird.  
+
= Skalare Variablen =
*Wichtig : zwischen der Variablen, dem = und dem Wert darf kein Leerzeichen stehen.  
+
* Eine Variable stellt einen Platzhalter dar.
*Man benutzt häufig Grossbuchtstaben, es sollten keine – benutzt  werden.   
+
* Man spricht von Variablensubstitution, wenn anstelle der Variablen deren Wert ausgegeben wird.
==Definition der Variable==
+
* Eine Variable muss – im Gegensatz zu kompilierten Programmiersprachen – nicht deklariert werden.
*GLAS=bier
+
* Der Interpreter allokiert den Speicherplatz zur Laufzeit.
Ausgabe des Variableninhalts
+
* Die Definition einer Variablen erfolgt durch Nennung, gefolgt von '''=''' und dem zugewiesenen Wert.  
*echo $GLAS
+
* Wichtig: Zwischen Variablenname, '''=''' und Wert darf kein Leerzeichen stehen.  
bier
+
* Es werden häufig Großbuchstaben verwendet; Bindestriche sollten vermieden werden.   
==Definition der Variable== 
 
*UNIXSYSTEM=/usr
 
:Variablensubstititution:
 
*ls -ld  $UNIXSYSTEM
 
drwxr-xr-x 11 root root 4096 2008-10-29 23:58 /usr
 
  
=Feld Variablen=
+
== Definition einer Variablen ==
*In Bash können Feldvariablen, auch bekannt als Arrays, verwendet werden, um eine Sammlung von Werten unter einem gemeinsamen Namen zu speichern und darauf zuzugreifen.
+
* '''GLAS=bier'''
*Feldvariablen in Bash werden durch Indizierung mit numerischen Werten oder Schlüsseln verwaltet und ermöglichen die Speicherung und Manipulation von mehreren Elementen in einer einzigen Variable.
 
==Definition der Feld Variablen==
 
*farbe=(blau gelb gruen rot)
 
==Ausgabe des Inhalts der Feld Variablen==
 
*echo ${farbe[0]}
 
blau
 
*echo ${farbe[1]}
 
gelb
 
*echo ${farbe[2]}
 
gruen
 
*echo ${farbe[3]}
 
rot
 
  
=Der Exportbefehl=
+
Ausgabe des Variableninhalts:
*Die Variable wird nicht automatisch an Kindprozess weitergegeben.
+
* '''echo $GLAS'''
*Mit export wird eine Variable markiert,  sodass sie in die Prozessumgebung übernommen wird um beim Forken auch dem Kindprozess zur Verfügung zu stehen.
+
bier
*Alle exportierten Variablen können mit dem Befehl ''printenv'' oder ''env'' angezeigt werden.
 
*Wirklich alle Shellvariablen werden mit set angezeigt.
 
  
=Kommandosubstitution=
+
== Beispiel einer Variablensubstitution ==  
*Die Kommandosubstitution in Bash ermöglicht es, den Ausgabewert eines Befehls innerhalb eines anderen Befehls oder einer Variablen zu verwenden.
+
* '''UNIXSYSTEM=/usr'''
*Durch die Verwendung von Backticks "`" oder dem Dollarzeichen gefolgt von öffnender und schließender runder Klammer "$( )" können Befehle innerhalb eines Befehls ausgeführt und das Ergebnis in den übergeordneten Befehl eingefügt werden.
+
* '''ls -ld $UNIXSYSTEM'''
;Es existieren zwei Varianten
+
drwxr-xr-x 11 root root 4096 2008-10-29 23:58 /usr
  
$(date)  
+
= 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.
  
`date`
+
== Definition ==
 +
* '''farbe=(blau gelb gruen rot)'''
  
=Bei der ersten Variante besteht die Möglichkeit zu schachteln:=
+
== Ausgabe einzelner Elemente ==
 +
* '''echo ${farbe[0]}''' → blau 
 +
* '''echo ${farbe[1]}''' → gelb 
 +
* '''echo ${farbe[2]}''' → gruen 
 +
* '''echo ${farbe[3]}''' → rot
  
*cd $(echo /home/$(whoami))
+
= Assoziative Arrays =
*cd `echo /home/`whoami``
+
* 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]}'''.
  
*date -u "+%X"
+
<syntaxhighlight lang=bash>
09:29:41
+
#!/bin/bash
*MOMENT=$(date -u "+%X")
+
declare -A fruits
*echo $MOMENT
+
fruits["apple"]="red"
09:29:58
+
fruits["banana"]="yellow"
*echo $MOMENT
+
fruits["orange"]="orange"
09:29:58
 
  
=Abgrenzen von Variablen=
+
echo ${fruits["apple"]}
*Folgt einem Dollarzeichen $ ein Variablenname oder eine öffnende geschweifte Klammer ${...}, so spricht man von einer Variablen- bzw. Parameterexpansion.
 
*Die geschweiften  Klammern dienen zur Gruppierung und sind bei skalaren Variablen, die nicht per Parameterexpansion behandelt werden sollen, nicht notwendig.
 
==Beispiele==
 
*SUX=eins
 
*TUX=zwei
 
*SUXTUX=drei
 
 
*echo $SUX
 
eins
 
*echo ${SUX}
 
eins
 
*echo $SUXTUX
 
drei
 
*echo ${SUX}TUX
 
einsTUX
 
*echo ${SUX}${TUX}
 
einszwei
 
  
=Weitere Mechanismen zur Parameterexpansion=
+
fruits["grape"]="purple"
Die weiteren Mechanismen zur Parameterexpansion manipulieren den Inhalt von Variablen.  "FARBE" bezeichnet
 
nachfolgend den Variablennamen und "rot" steht entweder für eine Zeichenkette oder für eine Variable, die
 
selbst wieder eine Parameter-, Kommando, Tildeexpansion oder eine arithmetische Berechnung beinhalten kann.
 
==Wenn die Variable $FARBE definiert ist, wird der Inhalt zurückgeliefert; wenn sie nicht definiert ist, wird rot zurückgeliefert
 
* ${FARBE:-rot}
 
*unset FARBE
 
*echo ${FARBE:-rot}
 
rot
 
*FARBE=gruen
 
*echo ${FARBE:-rot}
 
gruen
 
*echo $FARBE
 
gruen
 
*${FARBE:=rot}
 
==Wenn die Variable $FARBE definiert ist, wird der Inhalt zurückgeliefert, wenn sie nicht definiert ist, wird  rot  zurückgeliefert und die Variable $FARBE wird mit dem Wert rot belegt (somit ist sie definiert)=
 
*unset FARBE
 
*echo ${FARBE:=rot}
 
rot
 
*echo $FARBE
 
rot
 
* ${FARBE:?keine farbe gesetzt}
 
==Wenn die Variable $FARBE definiert ist, wird der Inhalt zurückgeliefert, wenn sie nicht definiert ist, wird 'keine farbe' als Fehlermitteilung ausgegeben. Der Rückgabewert ist dann auch ungleich 0.==
 
*unset FARBE
 
*echo ${FARBE:?keine farbe}
 
bash: FARBE: keine farbe
 
*echo $?
 
1
 
*FARBE=silber
 
*echo ${FARBE:?keine farbe}
 
silber
 
 
* ${FARBE:+rot}
 
==Wenn die Variable $FARBE definiert ist, wird rot  zurückgeliefert, ansonsten nichts==
 
*unset FARBE
 
*echo ${FARBE:+rot}
 
 
*FARBE=gelb
 
*echo ${FARBE:+rot}
 
rot
 
*echo $FARBE
 
gelb
 
 
* ${FARBE:4}
 
  
Der Inhalt der Variable wird ab der 4 Position bis zum Ende ausgegeben.
+
for key in "${!fruits[@]}"; do
Es wird ab 0 gezählt.
+
  echo "$key is ${fruits[$key]}"
 
+
done
*FARBE=rotweis
+
</syntaxhighlight>
*echo ${FARBE:3}
 
weis
 
 
* ${FARBE:5:3}
 
 
 
Ab der 5 Position werden 3 Zeichen ausgegeben. Es wird ab 0 gezählt.
 
 
 
*FARBE=schwarzbraun
 
*echo ${FARBE:5:3}
 
rzb
 
 
 
* ${#FARBE}
 
Die Anzahl Zeichen der Variable wird ausgegeben
 
 
 
*FARBE=schwarzbraun
 
*echo ${#FARBE}
 
12
 
 
 
* ${FARBE#rot}
 
 
 
Wenn das Wort rot am Anfang der Variable steht wird der Rest der Variable
 
ausgegeben . Wenn dies nicht so ist wird die Variable ausgegeben. 
 
*FARBE=rotweis
 
*echo ${FARBE#rot}
 
weis
 
 
 
* ${PROGRAM##*/}
 
 
 
Werden ## Kreuze angeben so wird die längstmögliche Ersetzung vorgenommen und der Rest wird ausgeben.
 
*PROGRAM=/usr/bin/passwd
 
*echo ${PROGRAM#*/}
 
usr/bin/passwd
 
*echo ${PROGRAM##*/}
 
passwd
 
 
 
* ${FARBE%weis}
 
  
Wenn das Wort rot am Ende der Variable steht wird der restliche Anfang  der Variable ausgegeben. Wenn dies nicht so ist wird die Variable ausgegeben.
+
= 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.
  
*FARBE=rotweis
+
= Kommandosubstitution =
*echo ${FARBE%weis}
+
* Die Kommandosubstitution ermöglicht, den Ausgabewert eines Befehls in einer Variablen zu speichern oder in einen anderen Befehl einzufügen.
rot
+
* Zwei Varianten:
 +
  ** '''$(Befehl)''' – moderne Variante, unterstützt Schachtelung 
 +
  ** ```Befehl``` – ältere Variante (Backticks)
  
* ${PROGRAM%%*/}
+
Beispiele:
 +
* '''cd $(echo /home/$(whoami))'''
 +
* '''cd `echo /home/`whoami``` 
 +
* '''MOMENT=$(date -u "+%X")''' 
 +
* '''echo $MOMENT''' → 09:29:58
  
Werden %% (2 Prozentzeichen) angeben, so wird die längstmögliche Ersetzung vorgenommen und der Anfang  wird ausgeben.
+
= Abgrenzen von Variablen =
*FARBE=rotweisrot
+
* Ein Dollarzeichen '''$''' leitet eine Variablenreferenz oder Parameterexpansion ein.
*echo ${FARBE%o*}
+
* Geschweifte Klammern '''${...}''' dienen zur Gruppierung.
rotweisr
 
*echo ${FARBE%%o*}
 
r
 
  
* ${FARBE/rot/blau}
+
== Beispiele ==
 +
* '''SUX=eins''' 
 +
* '''TUX=zwei''' 
 +
* '''SUXTUX=drei''' 
  
Ersetzen eines Musters. Kommt in der Variable FARBE ein rot vor, wird dies durch blau ersetzt.  
+
* '''echo $SUX''' → eins 
 +
* '''echo ${SUX}TUX''' → einsTUX 
 +
* '''echo ${SUX}${TUX}''' → einszwei  
  
* ${FARBE//rot/blau}
+
= Weitere Mechanismen zur Parameterexpansion =
 +
* Diese Mechanismen manipulieren Variableninhalte.
 +
* '''FARBE''' steht dabei für den Variablennamen, '''rot''' für eine Zeichenkette oder andere Variable.
  
Ersetzen eines Musters. Kommen in der Variable FARBE mehrere rot vor, werden sie durch blau ersetzt.
+
== 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“
  
*FARBE=rotweisrot
+
= Wichtige Systemvariablen (Auswahl) =
*echo ${FARBE/rot/blau}
 
blauweisrot
 
*echo ${FARBE//rot/blau}
 
blauweisblau
 
 
 
=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
Letztes aktuelles Verzeichnis vor cd
+
Vorheriges Verzeichnis
; PS1 ,PS2 , PS3
+
; PS1, PS2, PS3
Eingabeprompt 1 2 und 3
+
Eingabeprompts 1 3
 
; UID
 
; UID
Benutzerkennung
+
Benutzerkennung
 
; EDITOR
 
; EDITOR
Standardeditor (wenn nicht belegt, dann vi)
+
Standardeditor (meist vi)
 
; MAIL
 
; MAIL
Dort werden die Mails gespeichert
+
Pfad zum Postfach 
 
; HOSTNAME
 
; HOSTNAME
Name des Rechners
+
Name des Rechners
  
=Stellungsparameter (Spezielle Variablen)=
+
= Stellungsparameter (spezielle Variablen) =
Den Stellungsparametern $1, $2, ..., $9 werden bei ihrer Definition nach ihrer Reihenfolge Werte zugewiesen.  
+
* Den Stellungsparametern '''$1, $2, , $9''' werden bei der Definition Werte nach ihrer Reihenfolge zugewiesen.
Die Definition erfolgt mit dem Kommando ''set',  einem Skript - oder Prozeduraufruf .  
+
* Der Geltungsbereich ist lokal – sie gelten nur in der aktuellen Bash und können nicht exportiert werden.
  
Ihr Geltungsbereich ist lokal, d.h. 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 der Variablen mittels set==
+
== Belegen durch Skriptaufruf ==
*set der fck ist eine klasse Mannschaft
+
* '''cat skript1'''
*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 der Variablen durch einen Skriptaufruf==
 
Die Variablen werden automatisch beim Skriptaufruf belegt, indem sie als Argumente dem Skript übergeben werden.
 
*cat skript1
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
#!/bin/bash
 
#!/bin/bash
echo "1         parameter $1"
+
echo "1. Parameter $1"
echo "2         parameter $2"
+
echo "2. Parameter $2"
echo "3         parameter $3"
+
echo "3. Parameter $3"
echo "4         parameter $4"
+
echo "4. Parameter $4"
echo "alle     parameter $*"
+
echo "alle Parameter $*"
echo "alle     parameter $@"
+
echo "alle Parameter $@"
echo "anzahl    parameter $#"
+
echo "Anzahl Parameter $#"
echo "skriptname      $0"
+
echo "Skriptname $0"
echo "PID des skriptes      $$"
+
echo "PID des Skripts $$"
echo "Rückgabewert letztes Kommando     $?"
+
echo "Rückgabewert letztes Kommando $?"
 
</syntaxhighlight>
 
</syntaxhighlight>
*./skript1 blau gruen gelb rot
 
1            parameter blau
 
2            parameter gruen
 
3            parameter gelb
 
4            parameter rot
 
alle        parameter blau gruen gelb rot
 
alle        parameter blau gruen gelb rot
 
anzahl      parameter 4
 
skriptname            ./skript1
 
PID des skriptes      1019
 
Rückgabewert letztes Kommando    0
 
 
==Systemparameter==
 
Der Begriff Systemparameter bezeichnet eine Variable, die von der bash automatisch mit Werten versorgt wird. Die aktuellen
 
Werte können vom Benutzer abgefragt werden.
 
 
Einige wichtige Systemparameter:
 
  
 +
* '''./skript1 blau gruen gelb rot'''
  
 +
= Systemparameter =
 
{| border=1 cellpadding="2"
 
{| border=1 cellpadding="2"
 
| $$
 
| $$
Zeile 284: Zeile 172:
 
|-
 
|-
 
| $-
 
| $-
| Liste der für die bash gesetzten Schalter
+
| Liste der für die Bash gesetzten Optionen
 
|-
 
|-
 
| $?
 
| $?
| Exitstatus des letzten Kommandos
+
| Exit-Status des letzten Kommandos
 
|-
 
|-
 
| $#
 
| $#
 
| Anzahl der Stellungsparameter
 
| Anzahl der Stellungsparameter
|-  
+
|-
 
| $*
 
| $*
| Liste der Stellungsparameter
+
| Liste aller Stellungsparameter
 
|-
 
|-
 
| $0
 
| $0
Zeile 299: Zeile 187:
 
|}
 
|}
  
==shift-Kommando==
+
= shift-Kommando =
Das Kommando bewirkt die Verschiebung aller Stellungsoperanden um eine Stelle nach links. Auf diese Weise ist
+
* Verschiebt alle Stellungsparameter um eine Stelle nach links.
nach der Anwendung des shift-Kommandos der Wert des 10ten Parameters in $9, der ursprüngliche Wert von $1 ist
+
* Beispiel:
verloren. Die Stellenanzahl, um die verschoben wird, kann angegeben werden, z. B. bewirkt der Befehl ''shift 4''
+
  ** '''set hallo ihr guten admins von der schule hier'''
das Verschieben um 4 Stellen nach links.
+
  ** '''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.
  
*set hallo ihr guten admins von der schule hier
+
== Weitere Mechanismen zur Parameterexpansion ==
*echo $1 $2 $3 $4
+
; Beschreiben Sie, was bei folgenden Parameterexpansionen passiert:
hallo ihr guten admins
+
* '''echo ${FARBE:-rot}'''
*shift
+
* '''echo ${FARBE:=rot}'''
*echo $1 $2 $3 $4
+
* '''echo ${FARBE:?keine farbe}'''
ihr guten admins von
+
* '''echo ${FARBE:+rot}'''
*shift 3
+
* '''echo ${FARBE:3}'''
*echo $1 $2 $3 $4
+
* '''echo ${FARBE:5:3}'''
von der schule hier
+
* '''echo ${#FARBE}'''
 +
* '''echo ${FARBE#rot}'''
 +
* '''echo ${PROGRAM#*/}'''
 +
* '''echo ${FARBE%weis}'''
 +
* '''echo ${FARBE%o*}'''
 +
* '''echo ${FARBE/rot/blau}'''

Aktuelle Version vom 12. Oktober 2025, 19: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)

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

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}