From e0271effdb3cbfa8fbb9a50db460ff639e4ffa6f Mon Sep 17 00:00:00 2001 From: rschaten Date: Mon, 24 Sep 2001 16:39:49 +0000 Subject: [PATCH] =?UTF-8?q?=C4nderungsvorschl=E4ge=20von=20Kai=20Th=F6ne?= =?UTF-8?q?=20eingebaut?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TODO | 1 + quellen.tex | 1 + tab_quoting_sonderzeichen.tex | 4 +- tab_quoting_zeichen.tex | 15 ++--- tab_return.tex | 11 ++++ tab_variablen_substitution.tex | 10 ++-- was_ist_die_shell.tex | 17 +++--- wie_sieht_ein_shell_skript_aus.tex | 91 ++++++++++++++++++++++++++---- wofuer_shell_programmierung.tex | 6 ++ 9 files changed, 122 insertions(+), 34 deletions(-) create mode 100644 TODO create mode 100644 tab_return.tex diff --git a/TODO b/TODO new file mode 100644 index 0000000..4db9517 --- /dev/null +++ b/TODO @@ -0,0 +1 @@ +- Kai Thöne in die 'Credits' diff --git a/quellen.tex b/quellen.tex index b814c17..f7e4532 100644 --- a/quellen.tex +++ b/quellen.tex @@ -2,6 +2,7 @@ \begin{itemize} \item Bash Reference Manual (\texttt{http://www.gnu.org/manual/bash-2.02/\\bashref.html}) +\item Die Man-Page der Bash \item Unix In A Nutshell (\texttt{http://www.oreilly.com/catalog/unixnut3/}) \item Unix Power Tools (\texttt{http://www.oreilly.com/catalog/upt2/}) \item Von DOS nach Linux HOWTO (\texttt{http://www.tu-harburg.de/\\\~{}semb2204/dlhp/HOWTO/DE-DOS-nach-Linux-HOWTO.html}) diff --git a/tab_quoting_sonderzeichen.tex b/tab_quoting_sonderzeichen.tex index b2341d9..c403dcc 100644 --- a/tab_quoting_sonderzeichen.tex +++ b/tab_quoting_sonderzeichen.tex @@ -9,11 +9,11 @@ \texttt{;} & Befehls-Trennzeichen\index{Befehls>-Trennzeichen} \tabularnewline\STRUT \texttt{\&} & Hintergrund-Verarbeitung \tabularnewline\STRUT -\texttt{( )} & Befehlsfolge\index{Befehls>-folge} \tabularnewline\STRUT +\texttt{( ) \{ \}} & Befehlsfolge\index{Befehls>-folge} \tabularnewline\STRUT \texttt{|} & Pipe \tabularnewline\STRUT \texttt{< > >\&} & Umlenkungssymbole \tabularnewline\STRUT \texttt{* ? [ ] \~{} + - @ !} & Meta-Zeichen\index{Meta-Zeichen} für Dateinamen \tabularnewline\STRUT -\texttt{` ` }(Backticks\footnote{Man erhält sie durch \Ovalbox{SHIFT} und die Taste neben dem Backspace.}) & Befehls-Substitution\index{Befehls>-Substitution} \tabularnewline\STRUT +\texttt{` ` }(Backticks oder Single Backquotes\footnote{Man erhält sie durch \Ovalbox{SHIFT} und die Taste neben dem Backspace.}) & Befehls-Substitution\index{Befehls>-Substitution} \tabularnewline\STRUT \texttt{\$} & Variablen-Substitution\index{Variablen>-Substitution} \tabularnewline\STRUT \texttt{\Ovalbox{NEWLINE} \Ovalbox{SPACE} \Ovalbox{TAB}} & Wort-Trennzeichen\footnote{Die Wort-Trennzeichen sind in der Variable \texttt{\$IFS}\index{\$IFS=\texttt{\$IFS}} abgelegt. Man kann diese Variable auch überschreiben, um elegant Strings zu zerlegen.} \end{longtable} diff --git a/tab_quoting_zeichen.tex b/tab_quoting_zeichen.tex index c829a1b..e95797c 100644 --- a/tab_quoting_zeichen.tex +++ b/tab_quoting_zeichen.tex @@ -7,15 +7,16 @@ \hline \endlastfoot -\texttt{\dq~\dq} & (Anführungszeichen) Alles zwischen diesen Zeichen ist -buchstabengetreu zu interpretieren. Ausnahmen sind folgende Zeichen, die ihre -spezielle Bedeutung beibehalten: \texttt{\$ ` \dq} \tabularnewline\STRUT - -\texttt{' '} & (Ticks\footnote{Sie liegen auf der Tastatur über der Raute.}) -Alls zwischen diesen Zeichen wird wörtlich genommen, mit Ausnahme eines -weiteren \texttt{'} oder eines Backslashes (\texttt{\textbackslash}) +\texttt{\dq~\dq} & (Anführungszeichen oder Double Quotes) Alles zwischen diesen +Zeichen ist buchstabengetreu zu interpretieren. Ausnahmen sind folgende +Zeichen, die ihre spezielle Bedeutung beibehalten: \texttt{\$ ` \dq} \tabularnewline\STRUT +\texttt{' '} & (Ticks oder (Single) Quotes\footnote{Sie liegen auf der Tastatur +über der Raute.}) Alls zwischen diesen Zeichen wird wörtlich genommen, mit +Ausnahme eines weiteren \texttt{'} oder eines Backslashes +(\texttt{\textbackslash}) \tabularnewline\STRUT + \texttt{\textbackslash} & (Backslash\index{Backslash}) Das Zeichen nach einem \textbackslash wird wörtlich genommen. Anwendung z. B. innerhalb von \texttt{\dq~\dq}, um \texttt{\dq}, \texttt{\$} und \texttt{`} zu entwerten. diff --git a/tab_return.tex b/tab_return.tex new file mode 100644 index 0000000..14fa49f --- /dev/null +++ b/tab_return.tex @@ -0,0 +1,11 @@ + \begin{longtable}{|X l|} +% KILLED & LINE!!!! \kill + \hline + \endfirsthead + \endhead + \endfoot + \hline + \endlastfoot + +\multicolumn{2}{|X|}{\texttt{return }\textsl{[ n ]}} \\ +\end{longtable} diff --git a/tab_variablen_substitution.tex b/tab_variablen_substitution.tex index b051c9f..17f0cfd 100644 --- a/tab_variablen_substitution.tex +++ b/tab_variablen_substitution.tex @@ -8,9 +8,9 @@ \endlastfoot \textsl{Variable}\texttt{=}\textsl{Wert} & Setzt die \textsl{Variable} auf den \textsl{Wert}. Dabei ist unbedingt darauf zu achten, daß zwischen dem Variablennamen und dem Gleichheitszeichen keine Leerzeichen stehen. \tabularnewline\STRUT -\texttt{\$\{}\textsl{Variable}\texttt{\}} & Nutzt den Wert von \textsl{Variable}. Die Klammern müssen nicht mit angegeben werden, wenn die \textsl{Variable} von Trennzeichen umgeben ist. \tabularnewline\STRUT -\texttt{\$\{}\textsl{Variable}\texttt{:-}\textsl{Wert}\texttt{\}} & Nutzt den Wert von \textsl{Variable}. Falls die \textsl{Variable} nicht gesetzt ist, wird der \textsl{Wert} benutzt. \tabularnewline\STRUT -\texttt{\$\{}\textsl{Variable}\texttt{:=}\textsl{Wert}\texttt{\}} & Nutzt den Wert von \textsl{Variable}. Falls die \textsl{Variable} nicht gesetzt ist, wird der \textsl{Wert} benutzt, und \textsl{Variable} erhält den \textsl{Wert}. \tabularnewline\STRUT -\texttt{\$\{}\textsl{Variable}\texttt{:?}\textsl{Wert}\texttt{\}} & Nutzt den Wert von \textsl{Variable}. Falls die \textsl{Variable} nicht gesetzt ist, wird der \textsl{Wert} ausgegeben und die Shell beendet. Wenn kein \textsl{Wert} angegeben wurde, wird der Text \texttt{parameter null or not set} ausgegeben. \tabularnewline\STRUT -\texttt{\$\{}\textsl{Variable}\texttt{:+}\textsl{Wert}\texttt{\}} & Nutzt den \textsl{Wert}, falls die \textsl{Variable} gesetzt ist, andernfalls nichts. +\texttt{\$\{}\textsl{Variable}\texttt{\}} & Nutzt den Wert von \textsl{Variable}. Die Klammern müssen nur angegeben werden, wenn auf die \textsl{Variable} eine Zahl, ein Buchstabe oder ein Unterstrich folgen. \tabularnewline\STRUT +\texttt{\$\{}\textsl{Variable}\texttt{:-}\textsl{Wert}\texttt{\}} & Nutzt den Wert von \textsl{Variable}. Falls die \textsl{Variable} nicht gesetzt oder leer ist, wird \textsl{Wert} benutzt. \tabularnewline\STRUT +\texttt{\$\{}\textsl{Variable}\texttt{:=}\textsl{Wert}\texttt{\}} & Nutzt den Wert von \textsl{Variable}. Falls die \textsl{Variable} nicht gesetzt oder leer ist, wird \textsl{Wert} benutzt, und \textsl{Variable} erhält den \textsl{Wert}. \tabularnewline\STRUT +\texttt{\$\{}\textsl{Variable}\texttt{:?}\textsl{Wert}\texttt{\}} & Nutzt den Wert von \textsl{Variable}. Falls die \textsl{Variable} nicht gesetzt oder leer ist, wird der \textsl{Wert} ausgegeben und die Shell beendet. Wenn kein \textsl{Wert} angegeben wurde, wird der Text \texttt{parameter null or not set} ausgegeben. \tabularnewline\STRUT +\texttt{\$\{}\textsl{Variable}\texttt{:+}\textsl{Wert}\texttt{\}} & \textsl{Wert}, falls die \textsl{Variable} gesetzt und nicht leer ist, andernfalls nichts. \end{longtable} diff --git a/was_ist_die_shell.tex b/was_ist_die_shell.tex index 29b34bf..df07b80 100644 --- a/was_ist_die_shell.tex +++ b/was_ist_die_shell.tex @@ -50,17 +50,18 @@ portabel. \item Die Korn-Shell\index{Korn-Shell|textbf}\index{Shell>Korn-|see{Korn-Shell}} (\texttt{ksh}\index{ksh=\texttt{ksh}|see{Korn-Shell}}), eine Weiterentwicklung -der Bourne-Shell, erlaubt das editieren in der Befehlszeile. Außerdem gibt es +der Bourne-Shell, erlaubt das Editieren in der Befehlszeile. Außerdem gibt es hier History\index{History}-Funktionen\footnote{History-Funktionen ermöglichen es dem Benutzer, einfach auf zurückliegende Befehle zurückgreifen zu können.}, eine Ganzzahl-Arithmetik, verbesserte Möglichkeiten zur Mustererkennung, -Aliase\index{Aliase}\footnote{Ein Alias ist eine Abkürzung für einen Befehl. -Beispielsweise kann man das Häufig benutzte \texttt{ls -la} einfach durch -\texttt{la} ersetzen.} und das Job-Controlling\footnote{Unter Job-Controlling -versteht man einen Mechanismus, mit dessen Hilfe der Benutzer die Ausführung -von Prozessen selektiv stoppen oder fortsetzen kann}\index{Job-Controlling}. -Außerdem bietet die Korn-Shell im Gegensatz zu fast allen anderen Shells die -Möglichkeit, Aliase und Shell-Funktionen an Subshells zu vererben. +Arrays, Aliase\index{Aliase}\footnote{Ein Alias ist eine Abkürzung für einen +Befehl. Beispielsweise kann man das Häufig benutzte \texttt{ls -la} einfach +durch \texttt{la} ersetzen.} und das Job-Controlling\footnote{Unter +Job-Controlling versteht man einen Mechanismus, mit dessen Hilfe der Benutzer +die Ausführung von Prozessen selektiv stoppen oder fortsetzen +kann}\index{Job-Controlling}. Außerdem bietet die Korn-Shell im Gegensatz zu +fast allen anderen Shells die Möglichkeit, Aliase und Shell-Funktionen an +Subshells zu vererben. \item Die C-Shell \index{C-Shell|textbf}\index{Shell>C-|see{C-Shell}} (\texttt{csh}\index{csh=\texttt{csh}|see{C-Shell}}) bietet ähnliche diff --git a/wie_sieht_ein_shell_skript_aus.tex b/wie_sieht_ein_shell_skript_aus.tex index 1e44bb6..9da3fcc 100644 --- a/wie_sieht_ein_shell_skript_aus.tex +++ b/wie_sieht_ein_shell_skript_aus.tex @@ -8,6 +8,11 @@ In der Shell stehen viele Mechanismen zur Verf Zunächst soll die Frage geklärt werden, wie man überhaupt ein ausführbares Shell-Skript schreibt. Dabei wird vorausgesetzt, daß dem Benutzer der Umgang mit mindestens einem Texteditor\index{Texteditor} (\texttt{vi}\index{vi=\texttt{vi}}, \texttt{emacs}\index{emacs=\texttt{emacs}} etc.) bekannt ist. +Bei der Erstellung oder Bearbeitung von Shell-Skripten muß darauf geachtet +werden, daß sich keine CR/LF-Zeilenumbrüche einschleichen, wie dies leicht bei +der Benutzung von MS-DOS bzw. Windows-Systemen zur Bearbeitung von Skripten +über das Netzwerk passieren kann. + \subsection{HowTo} Zunächst muß mit Hilfe des Editors eine Textdatei angelegt werden, in die der `Quelltext' geschrieben wird. Wie der aussieht, sollte man anhand der folgenden Abschnitte und der Beispiele im Anhang erkennen können. Beim Schreiben sollte man nicht mit den Kommentaren\index{Kommentar} geizen, da ein Shell-Skript auch schon mal sehr unleserlich werden kann. @@ -35,6 +40,9 @@ benutzt man das Kommando \texttt{chmod ugo+rx name} oder einfach \texttt{chmod +rx name}. Mit \texttt{chmod u+x name} hat nur der Besitzer der Datei Ausführungsrechte. +Um ein Shell-Skript ausführen zu können braucht es aus der Sicht des +ausführenden Benutzers mindestens die Rechte zum Lesen (r) und Ausführen (x). + Dann kann das Skript gestartet werden. Da sich aus Sicherheitsgründen auf den meisten Systemen das aktuelle Verzeichnis nicht im Pfad des Benutzers befindet, muß man der Shell noch mitteilen, wo sie zu suchen hat: Mit \texttt{./name} wird versucht, im aktuellen Verzeichnis (\texttt{./}) ein Programm namens \texttt{name} auszuführen. Auf den meisten Systemen befindet sich im Pfad der Eintrag \texttt{\~{}/bin} bzw. \texttt{/home/benutzername/bin}, das bedeutet daß man Skripte die immer wieder benutzt werden sollen dort ablegen kann, so daß sie auch ohne eine Pfadangabe gefunden werden. Wie der Pfad genau aussieht kann man an der Shell durch Eingabe von \texttt{echo \$PATH}\index{\$PATH=\texttt{\$PATH}} herausfinden. @@ -44,7 +52,16 @@ Auf den meisten Systemen befindet sich im Pfad der Eintrag \texttt{\~{}/bin} bzw Wenn unter Unix ein Prozeß beendet wird, gibt er einen Rückgabewert (auch Exit-Code oder Exit-Status genannt) an seinen aufrufenden Prozeß zurück. So kann der Mutterprozeß kontrollieren, ob die Ausführung des Tochterprozesses ohne Fehler beendet wurde. In einigen Fällen (z. B. \texttt{grep}\index{grep=\texttt{grep}}) werden unterschiedliche Exit-Codes für unterschiedliche Ereignisse benutzt. -Dieser Rückgabewert wird bei der interaktiven Benutzung der Shell nur selten benutzt. Aber in der Programmierung von Shell-Skripten ist er von unschätzbarem Wert. So kann das Skript automatisch entscheiden, ob bestimmte Aktionen ausgeführt werden sollen, die von anderen Aktionen ab\-hän\-gen. Beispiele dazu sieht man bei der Beschreibung der Kommandos \texttt{if}\index{if=\texttt{if}} (\ref{if}), \texttt{case}\index{case=\texttt{case}} (\ref{case}), \texttt{while}\index{while=\texttt{while}} (\ref{while}) und \texttt{until}\index{until=\texttt{until}} (\ref{until}), sowie in dem Abschnitt über Befehlsformen (\ref{befehlsformen}). +Dieser Rückgabewert wird bei der interaktiven Benutzung der Shell nur selten +benutzt, da Fehlermeldungen direkt vom Benutzer abgelesen werden können. Aber +in der Programmierung von Shell-Skripten ist er von unschätzbarem Wert. So kann +das Skript automatisch entscheiden, ob bestimmte Aktionen ausgeführt werden +sollen, die von anderen Aktionen ab\-hän\-gen. Beispiele dazu sieht man bei der +Beschreibung der Kommandos \texttt{if}\index{if=\texttt{if}} (\ref{if}), +\texttt{case}\index{case=\texttt{case}} (\ref{case}), +\texttt{while}\index{while=\texttt{while}} (\ref{while}) und +\texttt{until}\index{until=\texttt{until}} (\ref{until}), sowie in dem +Abschnitt über Befehlsformen (\ref{befehlsformen}). In der Bourne-Shell wird der Exit-Code des letzten aufgerufenen Programms in der Variable \texttt{\$?}\index{\$?=\texttt{\$?}} abgelegt. Üblicherweise geben Programme den Wert 0 zurück, bei irgendwelchen Problemen einen von 0 verschiedenen Wert. Das wird im folgenden Beispiel deutlich: \LTXtable{\textwidth}{tab_beisp_exitcode.tex} @@ -84,7 +101,18 @@ Die wichtigsten eingebauten Shell-Variablen sind:\nopagebreak \section{Variablen-Substitution}\index{Variablen>-Substitution|(textbf}\index{Substitution|see{Variablen-Subst.}}\index{Variablen|(textbf} \index{!==\texttt{!=}|(textbf}\index{\$\{Variable\}=\texttt{\$\{}\textsl{Variable}\texttt{\}}|(textbf}\index{\$\{Variable:-Wert\}=\texttt{\$\{}\textsl{Variable}\texttt{:-}\textsl{Wert}\texttt{\}}|(textbf}\index{\$\{Variable:=Wert\}=\texttt{\$\{}\textsl{Variable}\texttt{:=}\textsl{Wert}\texttt{\}}|(textbf}\index{\$\{Variable:?Wert\}=\texttt{\$\{}\textsl{Variable}\texttt{:?}\textsl{Wert}\texttt{\}}|(textbf}\index{\$\{Variable:+Wert\}=\texttt{\$\{}\textsl{Variable}\texttt{:+}\textsl{Wert}\texttt{\}}|(textbf} -Unter Variablen-Substitution versteht man verschiedene Methoden um die Inhalte von Variablen zu benutzen. Das umfaßt sowohl die einfache Zuweisung eines Wertes an eine Variable als auch einfache Möglichkeiten zur Fallunterscheidung. In den fortgeschritteneren Shell-Versionen (\texttt{bash}\index{Bourne-Again-Shell}, \texttt{ksh}\index{Korn-Shell}) existieren sogar Möglichkeiten, auf Substrings von Variableninhalten zuzugreifen. In der Standard-Shell benutzt man für einfache Aufgaben üblicherweise Tools wie \texttt{cut}, \texttt{basename}\index{basename=\texttt{basename}} oder \texttt{dirname}; komplexe Bearbeitungen erledigt der Stream-Editor \texttt{sed}\index{sed=\texttt{sed}}. Einleitende Informationen dazu finden sich im Kapitel über die Mustererkennung (\ref{mustererkennung}). +Unter Variablen-Substitution versteht man verschiedene Methoden um die Inhalte +von Variablen zu benutzen. Das umfaßt sowohl die einfache Zuweisung eines +Wertes an eine Variable als auch einfache Möglichkeiten zur Fallunterscheidung. +In den fortgeschritteneren Shell-Versionen +(\texttt{bash}\index{Bourne-Again-Shell}, \texttt{ksh}\index{Korn-Shell}) +existieren sogar Möglichkeiten, auf Substrings von Variableninhalten +zuzugreifen. In der Standard-Shell benutzt man für einfache Aufgaben +üblicherweise Tools wie \texttt{cut}, +\texttt{basename}\index{basename=\texttt{basename}} oder \texttt{dirname}; +komplexe Bearbeitungen erledigt der Stream-Editor +\texttt{sed}\index{sed=\texttt{sed}}. Einleitende Informationen dazu finden +sich im Kapitel über die Mustererkennung (\ref{mustererkennung}). Die folgenden Mechanismen stehen in der Standard-Shell bereit, um mit Variablen zu hantieren. Bei allen Angaben ist der Doppelpunkt optional. Wenn er aber angegeben wird, muß die \textsl{Variable} einen Wert enthalten. \nopagebreak \LTXtable{\textwidth}{tab_variablen_substitution.tex} @@ -100,7 +128,11 @@ Die folgenden Mechanismen stehen in der Standard-Shell bereit, um mit Variablen \index{' '=\texttt{' '}|see{Ticks}}\index{` `=\texttt{` `}|see{Backticks}}\index{\dq~\dq=\texttt{\dq~\dq}|see{Anführungszeichen}}\index{\textbackslash=\texttt{\textbackslash}|see{Backslash}} -Dies ist ein sehr schwieriges Thema, da hier mehrere ähnlich aussehende Zeichen völlig verschiedene Effekte bewirken. Unix unterscheidet allein zwischen drei verschiedenen Anführungszeichen. Das Quoten dient dazu, bestimmte Zeichen mit einer Sonderbedeutung vor der Shell zu `verstecken' um zu verhindern, daß diese expandiert (ersetzt) werden. +Dies ist ein sehr schwieriges Thema, da hier mehrere ähnlich aussehende Zeichen +völlig verschiedene Effekte bewirken. Die Bourne-Shell unterscheidet allein +zwischen drei verschiedenen Anführungszeichen. Das Quoten dient dazu, bestimmte +Zeichen mit einer Sonderbedeutung vor der Shell zu `verstecken' um zu +verhindern, daß diese expandiert (ersetzt) werden. Die folgenden Zeichen haben eine spezielle Bedeutung innerhalb der Shell:\nopagebreak \LTXtable{\textwidth}{tab_quoting_sonderzeichen.tex} @@ -123,8 +155,16 @@ Bei der Angabe von Dateinamen k Die wichtigsten Meta-Zeichen sind:\nopagebreak \LTXtable{\textwidth}{tab_metazeichen.tex} +\texttt{\~}, \texttt{\~{}}\textsl{name}, \texttt{\~{}+} und \texttt{\~{}-} +werden nicht von jeder Shell unterstützt. + \medskip\emph{Beispiele:}\nopagebreak \LTXtable{\textwidth}{tab_beisp_metazeichen.tex} + +Hier ist anzumerken, daß Hidden Files (Dateien, deren Name mit einem Punkt +beginnt) nicht durch ein einfaches \texttt{*} erfaßt werden, sondern nur durch +das Suchmuster \texttt{.*}. + \index{*=\texttt{*}|)}\index{?=\texttt{?}|)}\index{[abc]=\texttt{[}\textsl{abc}\texttt{]}|)}\index{[a-q]=\texttt{[}\textsl{a}\texttt{-}\textsl{q}\texttt{]}|)}\index{[!!abc]=\texttt{[!!}\textsl{abc}\texttt{]}|)}\index{Dateinamen|)} \index{\~{}=\texttt{\~{}}|)}\index{\~{}name=\texttt{\~{}}\textsl{name}|)}\index{\~{}+=\texttt{\~{}+}|)}\index{\~{}-=\texttt{\~{}-}|)} \index{Meta-Zeichen|)} @@ -145,10 +185,11 @@ TODO!!! Man unterscheidet in der Shell-Programmierung zwischen den Meta-Zeichen\index{Meta-Zeichen}, die bei der Bezeichnung von Dateinamen -eingesetzt werden (sogenanntes `Globbing'\index{Globbing}) und den Meta-Zeichen, die in -mehreren Programmen Verwendung finden, um z. B. Suchmuster zu definieren. Diese -Muster werden auch reguläre Ausdrücke (regular expression)\index{Regular -Expression|see{Regulärer Ausdruck}}\index{Expression|see{Regulärer +eingesetzt werden (sogenanntes `Globbing'\index{Globbing}) und den +Meta-Zeichen, die in mehreren Programmen Verwendung finden, um z. B. Suchmuster +zu definieren. Diese Muster werden auch reguläre Ausdrücke (regular +expression)\index{Regular Expression|see{Regulärer +Ausdruck}}\index{Expression|see{Regulärer Ausdruck}}\index{Ausdruck|see{Regulärer Ausdruck}} genannt. Sie bieten wesentlich mehr Möglichkeiten als die relativ einfachen Wildcards für Dateinamen. @@ -198,9 +239,20 @@ Kommentare in der Shell beginnen immer mit dem Nummern-Zeichen (\verb\#\). Dabei \subsection{Auswahl der Shell (\texttt{\#!})}\label{auswahl_der_shell}\index{\#!!=\texttt{\#!!}|see{Shell / Auswahl der\ldots}}\index{Shell>Auswahl der\ldots|(textbf} -In der ersten Zeile eines Shell-Skriptes sollte definiert werden, mit welcher Shell das Skript ausgeführt werden soll. Das System öffnet dann eine Subshell\index{Subshell} und führt das restliche Skript in dieser aus. +In der ersten Zeile eines Shell-Skriptes sollte definiert werden, mit welchem +Programm das Skript ausgeführt werden soll. Das System öffnet dann eine +Subshell\index{Subshell} und führt das restliche Skript in dieser aus. + +Die Angabe erfolgt über eine Zeile in der Form \verb\#!/bin/sh\, wobei unter +\verb\/bin/sh\ die entsprechende Shell (in diesem Fall die Bourne-Shell) liegt. +Dieser Eintrag wirkt nur dann, wenn er in der ersten Zeile und der ersten +Spalte des Skripts steht. + +Dieser Mechanismus ist bei der Bourne-Shell nicht vorhanden, er wurde mit den +moderneren Shells eingeführt um eben durch die Angabe von \verb\#!/bin/sh\ die +Bourne-Shell für die Ausführung von Shell-Skripten benutzen zu können. In der +Bourne-Shell wirkt das führende \verb\#\ als Kommentarzeichen. -Die Angabe erfolgt über eine Zeile in der Form \verb\#!/bin/sh\, wobei unter \verb\/bin/sh\ die entsprechende Shell (in diesem Fall die Bourne-Shell) liegt. Dieser Eintrag wirkt nur dann, wenn er in der ersten Zeile des Skripts steht. \index{Shell>Auswahl der\ldots|)} @@ -223,13 +275,17 @@ Die `gesourcte' Datei wird eingelesen und ausgef \index{source=\texttt{source}|)} -\subsection{Funktionen}\index{Funktion|(textbf} +\subsection{Funktionen}\label{funktionen}\index{Funktion|(textbf} Es ist in der Shell auch möglich, ähnlich wie in einer `richtigen' Programmiersprache Funktionen zu deklarieren und zu benutzen. Da die Bourne-Shell (\verb\sh\) nicht über Aliase\index{Aliase} verfügt, können einfache Funktionen als Ersatz dienen. -Der Rückgabewert einer Funktion ist gleich dem Rückgabewert des letzten in der Funktion aufgerufenen Kommandos. +Der Rückgabewert einer Funktion ist gleich dem Rückgabewert des letzten in der +Funktion aufgerufenen Kommandos, es sei denn man gibt mittels +\verb\return\ (Siehe \ref{return}) explizit einen anderen Wert zurück. -\medskip\emph{Beispiel:} Die Funktion gibt die Anzahl der Dateien im aktuellen Verzeichnis zurück. Aufgerufen wird diese Funktion wie ein Befehl, also einfach durch die Eingabe von \verb\count\.\nopagebreak +\medskip\emph{Beispiel:} Die Funktion gibt die Anzahl der Dateien im aktuellen +Verzeichnis aus. Aufgerufen wird diese Funktion wie ein Befehl, also einfach +durch die Eingabe von \verb\count\.\nopagebreak \LTXtable{\textwidth}{tab_beisp_funktionen.tex} \index{Funktion|)} @@ -373,6 +429,17 @@ Die \texttt{exit}-Anweisung wird benutzt, um ein Skript zu beenden. Wenn der Par \index{exit=\texttt{exit}|)} +\subsection{return}\label{return}\index{return=\texttt{return}|(textbf} + +Die Syntax der \texttt{return}-Anweisung lautet wie folgt:\nopagebreak +\LTXtable{\textwidth}{tab_return.tex} + +Mittels \texttt{return} kann eine Funktion (siehe \ref{funktionen}) einen +bestimmten Wert zurückgeben. Anderenfalls wird der Exit-Code des letzten in der +Funktion ausgeführten Befehls zurückgegeben. +\index{return=\texttt{return}|)} + + \section{Befehlsformen}\label{befehlsformen}\index{Befehls>-formen|(textbf} \index{\&=\texttt{\&}|(textbf}\index{;=\texttt{;}|(textbf}\index{( )=\texttt{( )}|(textbf}\index{\{ \}=\texttt{\{ \}}|(textbf}\index{Pipe|(textbf}\index{Backticks|(textbf}\index{\&\&=\texttt{\&\&}|(textbf}\index{!|!|=\texttt{!|!|}|(textbf}\index{Befehls>-substitution|(textbf}\index{Befehls>-folge|(textbf}\index{Befehls>-block|(textbf} \index{!|=\texttt{!|}|see{Pipe}}\index{Substitution|see{Befehls-Subst.}} diff --git a/wofuer_shell_programmierung.tex b/wofuer_shell_programmierung.tex index a4a3752..93c30c2 100644 --- a/wofuer_shell_programmierung.tex +++ b/wofuer_shell_programmierung.tex @@ -1,5 +1,11 @@ \chapter{Wofür Shell-Programmierung?} +Die Shell ist der perfekte Baukasten für das Unix-Paradigma `small is +beautiful'. Die mitgelieferten Unix-Standardkommandos sind einfach gehalten, +erledigen aber auf effiziente Weise die Arbeit für die sie programmiert wurden. +Mit der Shell, bzw. dem Shell-Skript, wird aus dem Heinzelmännchen ein starker +Riese. + Shell-Skripte werden im Wesentlichen aus zwei Gründen geschrieben: Erstens, weil man so ständig wiederkehrende Kommandos zusammenfassen kann, die man dann mit einem einfachen Aufruf starten kann, und zweitens, weil man so einfache