Zum Inhalt springenZur Seitennavigation springen: vorherige Seite [Zugriffstaste p]/nächste Seite [Zugriffstaste n]
documentation.suse.com / SUSE Linux Enterprise Desktop-Dokumentation / Verwaltungshandbuch / Häufige Tasks / Bash-Shell und Bash-Skripte
Gilt für SUSE Linux Enterprise Desktop 15 SP6

1 Bash-Shell und Bash-Skripte

Heutzutage werden zunehmend Computer mit einer grafischen Bedienoberfläche (GUI) wie GNOME verwendet. GUIs bieten zwar viele Funktionen, kommen jedoch an ihre Grenzen, wenn automatische Aufgaben ausgeführt werden sollen. Shells sind eine gute Ergänzung für GUIs. In diesem Kapitel erhalten Sie einen Überblick über verschiedene Aspekte von Shells, in diesem Fall Bash-Shells.

1.1 Was ist die Shell?

Traditionell handelt es sich bei der Linux-Shell um Bash (Bourne again Shell). Wenn in diesem Kapitel die Rede von der Shell ist, ist die Bash-Shell gemeint. Außer Bash sind noch weitere Shells verfügbar (ash, csh, ksh, zsh und viele mehr), von denen jede unterschiedliche Funktionen und Merkmale aufweist. Wenn Sie weitere Informationen über andere Shells wünschen, suchen Sie in YaST nach shell.

1.1.1 Bash-Konfigurationsdateien

Eine Shell lässt sich aufrufen als:

  1. Interaktive Login-Shell.  Diese wird zum Anmelden bei einem Computer durch den Aufruf von Bash mit der Option --login verwendet oder beim Anmelden bei einem entfernten Computer mit SSH.

  2. Gewöhnliche interaktive Shell.  Dies ist normalerweise beim Starten von xterm, konsole, gnome-terminal oder ähnlichen Befehlszeilenschnittstellen-Tools (CLI-Tools) der Fall.

  3. Nicht interaktive Shell.  Dies wird beim Aufrufen eines Shell-Skripts in der Befehlszeile verwendet.

Jede Shell liest andere Konfigurationsdateien. Die folgenden Tabellen zeigen die Login- und Nicht-Login-Shell-Konfigurationsdateien.

Tipp
Tipp

Bash sucht die Konfigurationsdateien in einer bestimmten Reihenfolge, abhängig von der Art der Shell, in der sie ausgeführt wird. Weitere Informationen zu Bash finden Sie auf der man-Seite (man 1 bash). Suchen Sie nach der Überschrift INVOCATION.

Tabelle 1.1: Bash-Konfigurationsdateien für Login-Shells

Datei

Beschreibung

/etc/profile

Bearbeiten Sie diese Datei nicht, andernfalls werden Ihre Änderungen beim nächsten Update möglicherweise zerstört.

/etc/profile.local

Verwenden Sie diese Datei, wenn Sie /etc/profile erweitern.

/etc/profile.d/

Enthält systemweite Konfigurationsdateien für bestimmte Programme

~/.profile

Fügen Sie hier benutzerspezifische Konfigurationsdaten für Login-Shells ein.

Die Login-Shell greift außerdem auf die unter Tabelle 1.2, „Bash-Konfigurationsdateien für Nicht-Login-Shells“ aufgeführten Konfigurationsdateien zu.

Tabelle 1.2: Bash-Konfigurationsdateien für Nicht-Login-Shells

/etc/bash.bashrc

Bearbeiten Sie diese Datei nicht, andernfalls werden Ihre Änderungen beim nächsten Update möglicherweise zerstört.

/etc/bash.bashrc.local

Verwenden Sie diese Datei, um Ihre systemweiten Änderungen nur für die Bash-Shell einzufügen.

~/.bashrc

Fügen Sie hier benutzerspezifische Konfigurationsdaten ein.

Zusätzlich verwendet die Bash-Shell einige weitere Dateien:

Tabelle 1.3: Besondere Dateien für die Bash-Shell

Datei

Beschreibung

~/.bash_history

Enthält eine Liste aller Befehle, die Sie eingegeben haben.

~/.bash_logout

Wird beim Abmelden ausgeführt.

~/.alias

Benutzerdefinierte Aliasse für häufig verwendete Befehle. Weitere Details zum Definieren von Aliassen finden Sie unter man 1 alias.

Shells zur Verhinderung der Anmeldung

Bestimmte Shells verhindern die Anmeldung von Benutzern im System: /bin/false und /sbin/nologin. Beide geben bei Anmeldeversuchen von Benutzern im System automatisch einen Fehler aus. Diese Methode war als Sicherheitsmaßnahme für Systembenutzer gedacht. Moderne Linux-Betriebssysteme kontrollieren den Systemzugriff jedoch inzwischen mit effektiveren Tools wie PAM und AppArmor.

Die Standardeinstellung von SUSE Linux Enterprise Desktop ist die Zuweisung von /bin/bash zu menschlichen Benutzern und /bin/false oder /sbin/nologin zu Systembenutzern. Dem Benutzer nobody ist aus historischen Gründen /bin/bash zugewiesen. Es handelt sich dabei um einen Benutzer mit minimalen Rechten, der standardmäßig als Systembenutzer verwendet wurde. Jegliche Sicherheit, die durch den Benutzer nobody erreicht wird, geht jedoch verloren, wenn er von mehreren Systembenutzern verwendet wird. Es sollte möglich sein, ihn in /sbin/nologin zu ändern. Am schnellsten lässt sich dies testen, wenn Sie die Änderung vornehmen und sehen, ob dadurch Dienste oder Anwendungen beschädigt werden.

Mit folgendem Befehl wird unter /etc/passwd aufgelistet, welche Shells allen Benutzern, Systembenutzern und menschlichen Benutzern zugewiesen sind. Die Ausgabe unterscheidet sich je nach Services und Benutzer in Ihrem System:

> sort -t: -k 7 /etc/passwd | awk -F: '{print $1"\t" $7}' | column -t
tux               /bin/bash
nobody            /bin/bash
root              /bin/bash
avahi             /bin/false
chrony            /bin/false
dhcpd             /bin/false
dnsmasq           /bin/false
ftpsecure         /bin/false
lightdm           /bin/false
mysql             /bin/false
postfix           /bin/false
rtkit             /bin/false
sshd              /bin/false
tftp              /bin/false
unbound           /bin/false
bin               /sbin/nologin
daemon            /sbin/nologin
ftp               /sbin/nologin
lp                /sbin/nologin
mail              /sbin/nologin
man               /sbin/nologin
nscd              /sbin/nologin
polkitd           /sbin/nologin
pulse             /sbin/nologin
qemu              /sbin/nologin
radvd             /sbin/nologin
rpc               /sbin/nologin
statd             /sbin/nologin
svn               /sbin/nologin
systemd-coredump  /sbin/nologin
systemd-network   /sbin/nologin
systemd-timesync  /sbin/nologin
usbmux            /sbin/nologin
vnc               /sbin/nologin
wwwrun            /sbin/nologin
messagebus        /usr/bin/false
scard             /usr/sbin/nologin

1.1.2 Die Verzeichnisstruktur

Die folgende Tabelle bietet eine kurze Übersicht über die wichtigsten Verzeichnisse der höheren Ebene auf einem Linux-System. Ausführlichere Informationen über die Verzeichnisse und wichtige Unterverzeichnisse erhalten Sie in der folgenden Liste.

Tabelle 1.4: Überblick über eine Standardverzeichnisstruktur

Verzeichnis

Inhalt

/

root-Verzeichnis – Startpunkt der Verzeichnisstruktur.

/bin

Grundlegende binäre Dateien, z. B. Befehle, die der Systemadministrator und normale Benutzer brauchen. Enthält gewöhnlich auch die Shells, z. B. Bash.

/boot

Statische Dateien des Bootloaders.

/dev

Erforderliche Dateien für den Zugriff auf Host-spezifische Geräte.

/etc

Host-spezifische Systemkonfigurationsdateien.

/home

Enthält die Home-Verzeichnisse aller Benutzer mit einem Konto im System. Das Home-Verzeichnis von root befindet sich jedoch nicht unter /home, sondern unter /root.

/lib

Grundlegende freigegebene Bibliotheken und Kernel-Module.

/media

Einhängepunkte für Wechselmedien.

/mnt

Einhängepunkt für das temporäre Einhängen eines Dateisystems.

/opt

Add-On-Anwendungssoftwarepakete.

/root

Home-Verzeichnis für den Superuser root.

/sbin

Grundlegende Systembinärdateien.

/srv

Daten für Dienste, die das System bereitstellt.

/tmp

Temporäre Dateien.

/usr

Sekundäre Hierarchie mit Nur-Lese-Daten.

/var

Variable Daten wie Protokolldateien.

/windows

Nur verfügbar, wenn sowohl Microsoft Windows* als auch Linux auf Ihrem System installiert ist. Enthält die Windows-Daten.

Die folgende Liste bietet detailliertere Informationen und einige Beispiele für die Dateien und Unterverzeichnisse, die in den Verzeichnissen verfügbar sind:

/bin

Enthält die grundlegenden Shell-Befehle, die root-Benutzer und andere Benutzer verwenden können. Zu diesen Befehlen gehören ls, mkdir, cp, mv, rm und rmdir. /bin umfasst außerdem Bash, die Standard-Shell in SUSE Linux Enterprise Desktop.

/boot

Enthält Daten, die zum Booten erforderlich sind, wie zum Beispiel den Bootloader, den Kernel und andere Daten, die verwendet werden, bevor der Kernel mit der Ausführung von Programmen im Benutzermodus beginnt.

/dev

Enthält Gerätedateien, die Hardware-Komponenten darstellen.

/etc

Enthält lokale Konfigurationsdateien, die den Betrieb von Programmen wie das X Window System steuern können. Das Unterverzeichnis /etc/init.d enthält LSB-init-Skripte, die während des Bootvorgangs ausgeführt werden können.

/home/USERNAME

Enthält die privaten Daten aller Benutzer, die ein Konto auf dem System haben. Die Dateien, die hier gespeichert sind, können nur durch den Besitzer oder den Systemadministrator geändert werden. Standardmäßig befinden sich hier Ihr Email-Verzeichnis und Ihre persönliche Desktopkonfiguration in Form von verborgenen Dateien und Verzeichnissen wie .gconf/ und .config.

Anmerkung
Anmerkung: Home-Verzeichnis in einer Netzwerkumgebung

Wenn Sie in einer Netzwerkumgebung arbeiten, kann Ihr Home-Verzeichnis einem von /home abweichenden Verzeichnis im Dateisystem zugeordnet sein.

/lib

Enthält die grundlegenden freigegebenen Bibliotheken, die zum Booten des Systems und zur Ausführung der Befehle im root-Dateisystem erforderlich sind. Freigegebene Bibliotheken entsprechen in Windows DLL-Dateien.

/media

Enthält Einhängepunkte für Wechselmedien, z. B. CD-ROMs, Flash-Laufwerke und Digitalkameras (sofern sie USB verwenden). Unter /media sind beliebige Laufwerktypen gespeichert, mit Ausnahme der Festplatte Ihres Systems. Wenn Ihr Wechselmedium eingelegt bzw. mit dem System verbunden und eingehängt wurde, können Sie von hier darauf zugreifen.

/mnt

Dieses Verzeichnis bietet einen Einhängepunkt für ein vorübergehend eingehängtes Dateisystem. root kann hier Dateisysteme einhängen.

/opt

Reserviert für die Installation von Drittanbieter-Software. Hier finden Sie optionale Softwareprogramme und größere Add-On-Programmpakete.

/root

Home-Verzeichnis für den Benutzer root. Hier befinden sich die persönlichen Daten von root.

/run

Ein tmpfs-Verzeichnis, das von systemd und verschiedenen Komponenten genutzt wird. /var/run stellt einen symbolischen Link zu /run dar.

/sbin

Wie durch das s angegeben, enthält dieses Verzeichnis Dienstprogramme für den Superuser. /sbin enthält die Binärdateien, die zusätzlich zu den Binärdateien in /bin zum Booten und Wiederherstellen des Systems unbedingt erforderlich sind.

/srv

Enhält Daten für Dienste, die das System bereitstellt, z. B. FTP und HTTP.

/tmp

Dieses Verzeichnis wird von Programmen benutzt, die eine temporäre Speicherung von Dateien verlangen.

Wichtig
Wichtig: Bereinigen des temporären Verzeichnisses /tmp bei Systemstart

Im Verzeichnis /tmp gespeicherte Daten werden nicht zwingend bei einem Neustart des Systems beibehalten. Dies ist beispielsweise von den Einstellungen in /etc/tmpfiles.d/tmp.conf abhängig.

/usr

/usr hat nichts mit Benutzern („user“) zu tun, sondern ist das Akronym für UNIX-Systemressourcen. Die Daten in /usr sind statische, schreibgeschützte Daten, die auf verschiedenen Hosts freigegeben sein können, die den Filesystem Hierarchy Standard (FHS) einhalten. Dieses Verzeichnis enthält alle Anwendungsprogramme (auch die grafischen Desktops wie GNOME) und bildet eine zweite Hierarchie im Dateisystem. /usr enthält mehrere Unterverzeichnisse wie /usr/bin, /usr/sbin, /usr/local und /usr/share/doc.

/usr/bin

Enthält Programme, die für den allgemeinen Zugriff verfügbar sind.

/usr/sbin

Enthält Programme, die für den Systemadministrator reserviert sind, z. B. Reparaturfunktionen.

/usr/local

In diesem Verzeichnis kann der Systemadministrator lokale, verteilungsunabhängige Erweiterungen installieren.

/usr/share/doc

Enthält verschiedene Dokumentationsdateien und die Versionshinweise für Ihr System. Im Unterverzeichnis manual befindet sich eine Online-Version dieses Handbuchs. Wenn mehrere Sprachen installiert sind, kann dieses Verzeichnis die Handbücher für verschiedene Sprachen enthalten.

Im Verzeichnis packages finden Sie die Dokumentation zu den auf Ihrem System installierten Software-Paketen. Für jedes Paket wird ein Unterverzeichnis /usr/share/doc/packages/PACKAGENAME erstellt, das häufig README-Dateien für das Paket und manchmal Beispiele, Konfigurationsdateien oder zusätzliche Skripte umfasst.

Wenn HOWTOs (Verfahrensbeschreibungen) auf Ihrem System installiert sind, enthält /usr/share/doc auch das Unterverzeichnis howto mit zusätzlicher Dokumentation zu vielen Aufgaben im Zusammenhang mit der Einrichtung und Ausführung von Linux-Software.

/var

Während /usr statische, schreibgeschützte Daten enthält, ist /var für Daten, die während des Systembetriebs geschrieben werden und daher variabel sind, z. B. Protokolldateien oder Spooling-Daten. Eine Übersicht über die wichtigsten Protokolldateien finden Sie unter /var/log/. Weitere Informationen stehen auch unter Tabelle 42.1, „Protokolldateien“ zur Verfügung.

/windows

Nur verfügbar, wenn sowohl Microsoft Windows als auch Linux auf Ihrem System installiert ist. Enthält die Windows-Daten, die auf der Windows-Partition Ihres Systems verfügbar sind. Ob Sie die Daten in diesem Verzeichnis bearbeiten können, hängt vom Dateisystem ab, das Ihre Windows-Partition verwendet. Falls es sich um FAT32 handelt, können Sie die Dateien in diesem Verzeichnis öffnen und bearbeiten. Für NTFS unterstützt SUSE Linux Enterprise Desktop auch den Schreibzugriff. Die Funktionalität des Treibers für das NTFS-3g-Dateisystem ist jedoch eingeschränkt.

1.2 Schreiben von Shell-Skripten

Shell-Skripte bieten eine bequeme Möglichkeit, die verschiedensten Aufgaben zu erledigen: Erfassen von Daten, Suche nach einem Wort oder Begriff in einem Text und andere nützliche Dinge. Das folgende Beispiel zeigt ein kleines Shell-Skript, das einen Text druckt:

Beispiel 1.1: Ein Shell-Skript, das einen Text druckt
#!/bin/sh 1
# Output the following line: 2
echo "Hello World" 3

1

Die erste Zeile beginnt mit den Shebang-Zeichen (#!), die angeben, dass diese Datei ein Skript ist. Der Interpreter, der nach dem Shebang angegeben wird, führt das Skript aus. In diesem Fall ist /bin/sh der angegebene Interpreter.

2

Die zweite Zeile ist ein Kommentar, der mit dem Hash-Zeichen beginnt. Wir empfehlen Ihnen, schwierige Zeilen zu kommentieren. Richtiges Kommentieren erinnert Sie an den Zweck und die Funktion der Zeile. Auch andere Leser können dadurch Ihr Skript besser verstehen. Das Kommentieren wird in der Entwickler-Community als gute Vorgehensweise angesehen.

3

Die dritte Zeile verwendet den integrierten Befehl echo, um den entsprechenden Text zu drucken.

Vor Ausführung dieses Skripts sind einige Voraussetzungen zu erfüllen:

  1. Jedes Skript muss eine Shebang-Zeile enthalten (wie im obigen Beispiel). Falls die Zeile fehlt, müssen Sie den Interpreter manuell aufrufen.

  2. Sie können das Skript an beliebiger Stelle speichern. Jedoch empfiehlt es sich, es in einem Verzeichnis zu speichern, in dem die Shell es finden kann. Der Suchpfad in einer Shell wird durch die Umgebungsvariable PATH bestimmt. Ein normaler Benutzer verfügt nicht über Schreibzugriff auf /usr/bin. Daher sollten Sie Ihre Skripte im Benutzerverzeichnis ~/bin/ speichern. Das obige Beispiel erhält den Namen hello.sh.

  3. Das Skript muss zum Ausführen von Dateien berechtigt sein. Stellen Sie die Berechtigungen mit dem folgenden Befehl ein:

    > chmod +x ~/bin/hello.sh

Wenn Sie alle oben genannten Voraussetzungen erfüllt haben, können Sie das Skript mithilfe der folgenden Methoden ausführen:

  1. Als absoluten Pfad.  Das Skript kann mit einem absoluten Pfad ausgeführt werden. In unserem Fall lautet er ~/bin/hello.sh.

  2. Überall.  Wenn die Umgebungsvariable PATH das Verzeichnis enthält, in dem sich das Skript befindet, können Sie das Skript mit hello.sh ausführen.

1.3 Umlenken von Befehlsereignissen

Jeder Befehl kann drei Kanäle für Eingabe oder Ausgabe verwenden:

  • Standardausgabe.  Dies ist der Standardausgabe-Kanal. Immer wenn ein Befehl eine Ausgabe erzeugt, verwendet es den Standardausgabe-Kanal.

  • Standardeingabe.  Wenn ein Befehl Eingaben von Benutzern oder anderen Befehlen benötigt, verwendet es diesen Kanal.

  • Standardfehler.  Befehle verwenden diesen Kanal zum Melden von Fehlern.

Zum Umlenken dieser Kanäle bestehen folgende Möglichkeiten:

Command > File

Speichert die Ausgabe des Befehls in eine Datei; die bestehende Datei wird gelöscht. Beispielsweise schreibt der Befehl ls seine Ausgabe in die Datei listing.txt:

> ls > listing.txt
Command >> File

Hängt die Ausgabe des Befehls an eine Datei an. Beispielsweise hängt der Befehl ls seine Ausgabe an die Datei listing.txt an:

> ls >> listing.txt
Command < File

Liest die Datei als Eingabe für den angegebenen Befehl. Beispielsweise liest der Befehl read den Inhalt der Datei in die Variable ein:

> read a < foo
Command1 | Command2

Leitet die Ausgabe des linken Befehls als Eingabe für den rechten Befehl um. Beispiel: Der Befehl cat gibt den Inhalt der Datei /proc/cpuinfo aus. Diese Ausgabe wird von grep verwendet, um nur diejenigen Zeilen herauszufiltern, die cpu enthalten:

> cat /proc/cpuinfo | grep cpu

Jeder Kanal verfügt über einen Dateideskriptor: 0 (Null) für Standardeingabe, 1 für Standardausgabe und 2 für Standardfehler. Es ist zulässig, diesen Dateideskriptor vor einem <- oder >-Zeichen einzufügen. Beispielsweise sucht die folgende Zeile nach einer Datei, die mit foo beginnt, Fehlermeldungen werden jedoch durch Umlenkung zu /dev/null unterdrückt:

> find / -name "foo*" 2>/dev/null

1.4 Verwenden von Aliassen

Ein Alias ist ein Definitionskürzel für einen oder mehrere Befehle. Die Syntax für einen Alias lautet:

alias NAME=DEFINITION

Beispielsweise definiert die folgende Zeile den Alias lt, der eine lange Liste ausgibt (Option -l), sie nach Änderungszeit sortiert (-t) und sie in umgekehrter Reihenfolge sortiert ausgibt (-r):

> alias lt='ls -ltr'

Zur Anzeige aller Aliasdefinitionen verwenden Sie alias. Entfernen Sie den Alias mit unalias und dem entsprechenden Aliasnamen.

1.5 Verwenden von Variablen in der Bash-Shell

Eine Shell-Variable kann global oder lokal sein. Auf globale Variablen, z. B. Umgebungsvariablen, kann in allen Shells zugegriffen werden. Lokale Variablen sind hingegen nur in der aktuellen Shell sichtbar.

Verwenden Sie zur Anzeige von allen Umgebungsvariablen den Befehl printenv. Wenn Sie den Wert einer Variable kennen müssen, fügen Sie den Namen Ihrer Variablen als ein Argument ein:

> printenv PATH

Eine Variable (global oder lokal) kann auch mit echo angezeigt werden:

> echo $PATH

Verwenden Sie zum Festlegen einer lokalen Variablen einen Variablennamen, gefolgt vom Gleichheitszeichen und dem Wert für den Namen:

> PROJECT="SLED"

Geben Sie keine Leerzeichen um das Gleichheitszeichen ein, sonst erhalten Sie einen Fehler. Verwenden Sie zum Setzen einer Umgebungsvariablen export:

> export NAME="tux"

Zum Entfernen einer Variable verwenden Sie unset:

> unset NAME

Die folgende Tabelle enthält gängige Umgebungsvariablen, die Sie in Ihren Shell-Skripten verwenden können:

Tabelle 1.5: Nützliche Umgebungsvariablen

HOME

Home-Verzeichnis des aktuellen Benutzers

HOST

Aktueller Hostname

LANG

Wenn ein Werkzeug lokalisiert wird, verwendet es die Sprache aus dieser Umgebungsvariablen. Englisch kann auch auf C gesetzt werden

PATH

Suchpfad der Shell, eine Liste von Verzeichnissen, die durch Doppelpunkte getrennt sind

PS1

Gibt die normale Eingabeaufforderung an, die vor jedem Befehl angezeigt wird

PS2

Gibt die sekundäre Eingabeaufforderung an, die beim Ausführen eines mehrzeiligen Befehls angezeigt wird

PWD

Aktuelles Arbeitsverzeichnis

USER

Aktueller Benutzer

1.5.1 Verwenden von Argumentvariablen

Wenn Sie beispielsweise über das Skript foo.sh verfügen, können Sie es wie folgt ausführen:

> foo.sh "Tux Penguin" 2000

Für den Zugriff auf alle Argumente, die an Ihr Skript übergeben werden, benötigen Sie Positionsparameter. Diese sind $1 für das erste Argument, $2 für das zweite usw. Sie können bis zu neun Parameter verwenden. Verwenden Sie $0 zum Abrufen des Skriptnamens.

Das folgende Skript foo.sh gibt alle Argumente von 1 bis 4 aus:

#!/bin/sh
echo \"$1\" \"$2\" \"$3\" \"$4\"

Wenn Sie das Skript mit den obigen Argumenten ausführen, erhalten Sie Folgendes:

"Tux Penguin" "2000" "" ""

1.5.2 Verwenden der Variablenersetzung

Variablenersetzungen wenden beginnend von links oder rechts ein Schema auf den Inhalt einer Variable an. Die folgende Liste enthält die möglichen Syntaxformen:

${VAR#pattern}

entfernt die kürzeste mögliche Übereinstimmung von links:

> file=/home/tux/book/book.tar.bz2
> echo ${file#*/}
home/tux/book/book.tar.bz2
${VAR##pattern}

entfernt die längste mögliche Übereinstimmung von links:

> file=/home/tux/book/book.tar.bz2
> echo ${file##*/}
book.tar.bz2
${VAR%pattern}

entfernt die kürzeste mögliche Übereinstimmung von rechts:

> file=/home/tux/book/book.tar.bz2
> echo ${file%.*}
/home/tux/book/book.tar
${VAR%%pattern}

entfernt die längste mögliche Übereinstimmung von rechts:

> file=/home/tux/book/book.tar.bz2
> echo ${file%%.*}
/home/tux/book/book
${VAR/pattern_1/pattern_2}

ersetzt den Inhalt von VAR von PATTERN_1 durch PATTERN_2:

> file=/home/tux/book/book.tar.bz2
> echo ${file/tux/wilber}
/home/wilber/book/book.tar.bz2

1.6 Gruppieren und Kombinieren von Befehlen

In Shells können Sie Befehle für die bedingte Ausführung verketten und gruppieren. Jeder Befehl übergibt einen Endcode, der den Erfolg oder Misserfolg seiner Ausführung bestimmt. Wenn er 0 (Null) lautet, war der Befehl erfolgreich, alle anderen Codes bezeichnen einen Fehler, der spezifisch für den Befehl ist.

Die folgende Liste zeigt, wie sich Befehle gruppieren lassen:

Command1 ; Command2

führt die Befehle in sequenzieller Reihenfolge aus. Der Endcode wird nicht geprüft. Die folgende Zeile zeigt den Inhalt der Datei mit cat an und gibt deren Dateieigenschaften unabhängig von deren Endcodes mit ls aus:

> cat filelist.txt ; ls -l filelist.txt
Command1 && Command2

führt den rechten Befehl aus, wenn der linke Befehl erfolgreich war (logisches UND). Die folgende Zeile zeigt den Inahlt der Datei an und gibt deren Dateieigenschaften nur aus, wenn der vorherige Befehl erfolgreich war (vgl. mit dem vorherigen Eintrag in dieser Liste):

> cat filelist.txt && ls -l filelist.txt
Command1 || Command2

führt den rechten Befehl aus, wenn der linke Befehl fehlgeschlagen ist (logisches ODER). Die folgende Zeile legt nur ein Verzeichnis in /home/wilber/bar an, wenn die Erstellung des Verzeichnisses in /home/tux/foo fehlgeschlagen ist:

> mkdir /home/tux/foo || mkdir /home/wilber/bar
funcname(){ ... }

erstellt eine Shell-Funktion. Sie können mithilfe der Positionsparameter auf ihre Argumente zugreifen. Die folgende Zeile definiert die Funktion hello für die Ausgabe einer kurzen Meldung:

> hello() { echo "Hello $1"; }

Sie können diese Funktion wie folgt aufrufen:

> hello Tux

Die Ausgabe sieht wie folgt aus:

Hello Tux

1.7 Arbeiten mit häufigen Ablaufkonstrukten

Um den Fluss Ihres Skripts zu steuern, verfügt eine Shell über die Konstrukte while, if, for und case.

1.7.1 Der Steuerungsbefehl „if“

Der Befehl if wird verwendet, um Ausdrücke zu prüfen. Beispielsweise testet der folgende Code, ob es sich beim aktuellen Benutzer um Tux handelt:

if test $USER = "tux"; then
  echo "Hello Tux."
else
  echo "You are not Tux."
fi

Der Testausdruck kann so komplex oder einfach wie möglich sein. Der folgende Ausdruck prüft, ob die Datei foo.txt existiert:

if test -e /tmp/foo.txt ; then
  echo "Found foo.txt"
fi

Der Testausdruck kann auch in eckigen Klammern abgekürzt werden:

if [ -e /tmp/foo.txt ] ; then
  echo "Found foo.txt"
fi

Weitere nützliche Ausdrücke finden Sie unter https://bash.cyberciti.biz/guide/If..else..fi.

1.7.2 Erstellen von Schleifen mit dem Befehl for

Mithilfe der for-Schleife können Sie Befehle an einer Liste von Einträgen ausführen. Beispielsweise gibt der folgende Code bestimmte Informationen über PNG-Dateien im aktuellen Verzeichnis aus:

for i in *.png; do
 ls -l $i
done

1.8 Weitere Informationen

Wichtige Informationen über die Bash-Shell finden Sie auf den man-Seiten zu man bash. Für weitere Informationen zu diesem Thema siehe die folgende Liste: