Viele Aenderungen, Tabellen durch Syntax-Boxen ausgetauscht, neues Kapitel: date
This commit is contained in:
@@ -82,9 +82,9 @@ einfach durch \lstinline|./skriptname| sondern durch
|
||||
\lstinline|sh -x ./skriptname|.
|
||||
|
||||
\item \texttt{set -v}: Dies funktioniert genau wie \lstinline|set -x|, auch der
|
||||
Aufruf über \lstinline|sh -v ./skriptname| funktioniert. Diese Option gibt jede
|
||||
Zeile vor der Ausführung aus, allerdings im Gegensatz zu \texttt{-x} nicht in
|
||||
der expandierten sondern in der vollen Form.
|
||||
Aufruf von der Kommandozeile über \lstinline|sh -v ./skriptname| funktioniert.
|
||||
Diese Option gibt jede Zeile vor der Ausführung aus, allerdings im Gegensatz zu
|
||||
\texttt{-x} nicht in der expandierten sondern in der vollen Form.
|
||||
|
||||
\item \texttt{set -e}: Alle gängigen Shell-Kommandos liefern einen
|
||||
Rückgabewert, der Auskunft über Erfolg oder Mißerfolg gibt (siehe Abschnitt
|
||||
@@ -152,13 +152,22 @@ der Variable \texttt{\$?}\index{\$?=\texttt{\$?}} abgelegt.
|
||||
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}
|
||||
\begin{lstlisting}
|
||||
$ cp datei /tmp
|
||||
$ echo $?
|
||||
0
|
||||
|
||||
$ cp datie /tmp
|
||||
cp: datie: Datei oder Verzeichnis nicht gefunden
|
||||
$ echo $?
|
||||
1
|
||||
\end{lstlisting}
|
||||
|
||||
Normalerweise wird man den Exit-Code nicht in dieser Form abfragen. Sinnvoller
|
||||
ist folgendes Beispiel, in dem eine Datei erst gedruckt wird, und dann~--~falls
|
||||
der Ausdruck erfolgreich war~--~gelöscht wird:
|
||||
|
||||
\LTXtable{\textwidth}{tab_beisp_exitcode_lpr.tex}
|
||||
\lstinline/$ lpr datei && rm datei/\index{\&\&=\texttt{\&\&}}
|
||||
|
||||
Näheres zur Verknüpfung von Aufrufen steht im Kapitel über Befehlsformen
|
||||
(\ref{befehlsformen}). Beispiele zur Benutzung von Rückgabewerten in Schleifen
|
||||
@@ -303,7 +312,22 @@ Die folgenden Zeichen k
|
||||
\LTXtable{\textwidth}{tab_quoting_zeichen.tex}
|
||||
|
||||
\medskip\emph{Beispiele:}\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_beisp_quoting.tex}
|
||||
|
||||
\begin{lstlisting}
|
||||
$ echo 'Ticks "schützen" Anführungszeichen'
|
||||
Ticks "schützen" Anführungszeichen
|
||||
|
||||
$ echo "Ist dies ein \"Sonderfall\"?"
|
||||
Ist dies ein "Sonderfall"?
|
||||
|
||||
$ echo "Sie haben `ls | wc -l` Dateien in `pwd`"
|
||||
Sie haben 43 Dateien in /home/rschaten
|
||||
|
||||
$ echo "Der Wert von \$x ist $x"
|
||||
Der Wert von $x ist 100
|
||||
\end{lstlisting}
|
||||
|
||||
|
||||
\index{Anführungszeichen|)}\index{Ticks|)}\index{Backslash|)}\index{;=\texttt{;}|)}\index{\&=\texttt{\&}|)}\index{( )=\texttt{( )}|)}\index{|=\texttt{|}|)}\index{<=\texttt{<}|)}\index{!>=\texttt{!>}|)}\index{!>\&=\texttt{!>\&}|)}\index{*=\texttt{*}|)}\index{?=\texttt{?}|)}\index{[ ]=\texttt{[ ]}|)}\index{\~{}=\texttt{\~{}}|)}\index{+=\texttt{+}|)}\index{-=\texttt{-}|)}\index{@=\texttt{@}|)}\index{!!=\texttt{!!}|)}\index{Backticks|)}\index{\$=\texttt{\$}|)}\index{[newline]=\texttt{[newline]}|)}\index{[space]=\texttt{[space]}|)}\index{[tab]=\texttt{[tab]}|)}
|
||||
\index{Quoting|)}
|
||||
|
||||
@@ -326,7 +350,18 @@ Die wichtigsten Meta-Zeichen sind:\nopagebreak
|
||||
werden nicht von jeder Shell unterstützt.
|
||||
|
||||
\medskip\emph{Beispiele:}\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_beisp_metazeichen.tex}
|
||||
|
||||
\begin{lstlisting}
|
||||
# Alle Dateien listen, die mit 'neu' anfangen:
|
||||
$ ls neu*
|
||||
|
||||
# 'neuX', 'neu4', aber nicht 'neu10' listen:
|
||||
$ ls neu?
|
||||
|
||||
# Alle Dateien listen, die mit einem Grossbuchstaben zwischen D und R
|
||||
# anfangen - Natuerlich ist die Shell auch hier Case-Sensitive:
|
||||
$ ls [D-R]*
|
||||
\end{lstlisting}
|
||||
|
||||
Hier ist anzumerken, daß Hidden Files (Dateien, deren Name mit einem Punkt
|
||||
beginnt) nicht durch ein einfaches \texttt{*} erfaßt werden, sondern nur durch
|
||||
@@ -410,7 +445,22 @@ expandierten Text erhalten. So lassen sich auch Variablen durch diese Technik
|
||||
erzeugen.
|
||||
|
||||
\medskip\emph{Beispiele:}\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_beisp_klammerexpansion.tex}
|
||||
\begin{lstlisting}
|
||||
# Folgende Verzeichnisse erzeugen:
|
||||
# - /usr/local/src/bash/old
|
||||
# - /usr/local/src/bash/new
|
||||
# - /usr/local/src/bash/dist
|
||||
# - /usr/local/src/bash/bugs
|
||||
$ mkdir /usr/local/src/bash/{old,new,dist,bugs}
|
||||
|
||||
# Die folgenden Dateien / Verzeichnisse dem Benutzer root zuweisen:
|
||||
# - /usr/ucb/ex
|
||||
# - /usr/ucb/edit
|
||||
# - /usr/lib/ex?.?*
|
||||
# - /usr/lib/how_ex
|
||||
# Dabei wird /usr/lib/ex?.?* noch weiter expandiert.
|
||||
$ chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
|
||||
\end{lstlisting}
|
||||
\index{Klammer-Expansion|)}
|
||||
|
||||
|
||||
@@ -515,7 +565,11 @@ der Bourne-Shell wirkt das f
|
||||
|
||||
\subsection{Null-Befehl (\texttt{:})}\label{null-befehl}\index{Null-Befehl|(textbf}\index{:=\texttt{:}|see{Null-Befehl}}\index{Doppelpunkt|see{Null-Befehl}}
|
||||
|
||||
Dieser Befehl tut nichts, außer den Status 0 zurückzugeben. Er wird benutzt, um Endlosschleifen\index{Endlosschleife} zu schreiben (siehe unter \ref{while}), oder um leere Blöcke in \texttt{if}- oder \texttt{case}-Konstrukten\index{if=\texttt{if}}\index{case=\texttt{case}} möglich zu machen.
|
||||
Dieser Befehl tut nichts, außer den Status 0 zurückzugeben. Er wird benutzt, um
|
||||
Endlosschleifen\index{Endlosschleife} zu schreiben (siehe unter \ref{while}),
|
||||
oder um leere Blöcke in \texttt{if}- oder
|
||||
\texttt{case}-Konstrukten\index{if=\texttt{if}}\index{case=\texttt{case}}
|
||||
möglich zu machen.
|
||||
|
||||
\begin{lstlisting}
|
||||
if who | grep $1 > /dev/null; then # who: Liste der Benutzer
|
||||
@@ -561,7 +615,13 @@ Funktion aufgerufenen Kommandos, es sei denn man gibt mittels
|
||||
Verzeichnis aus. Aufgerufen wird diese Funktion wie ein Befehl, also einfach
|
||||
durch die Eingabe von \texttt{count}.
|
||||
|
||||
\LTXtable{\textwidth}{tab_beisp_funktionen.tex}
|
||||
\begin{lstlisting}
|
||||
count () {
|
||||
ls -1 | wc -l # ls: Liste aller Dateien im Verzeichnis
|
||||
# Mit Parameter -1 einspaltig
|
||||
# wc: Word-Count, zählt mit Parameter -l Zeilen
|
||||
}
|
||||
\end{lstlisting}
|
||||
|
||||
\index{Funktion|)}
|
||||
|
||||
@@ -604,17 +664,50 @@ Bedingungen k
|
||||
|
||||
\subsection{if\ldots}\label{if}\index{if=\texttt{if}|(textbf}\index{then=\texttt{then}|see{if}}\index{elif=\texttt{elif}|see{if}}\index{else=\texttt{else}|see{if}}\index{fi=\texttt{fi}|see{if}}
|
||||
|
||||
Die \texttt{if}-Anweisung in der Shell-Programmierung macht das gleiche wie in allen anderen Programmiersprachen, sie testet eine Bedingung auf Wahrheit und macht davon den weiteren Ablauf des Programms abhängig.
|
||||
Die \texttt{if}-Anweisung in der Shell-Programmierung macht das gleiche wie in
|
||||
allen anderen Programmiersprachen, sie testet eine Bedingung auf Wahrheit und
|
||||
macht davon den weiteren Ablauf des Programms abhängig.
|
||||
|
||||
Die Syntax der \texttt{if}-Anweisung lautet wie folgt:\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_if.tex}
|
||||
|
||||
Wenn die \textsl{Bedingung1} erfüllt ist, werden die \textsl{Befehle1} ausgeführt; andernfalls, wenn die \textsl{Bedingung2} erfüllt ist, werden die \textsl{Befehle2} ausgeführt. Trifft keine Bedingung zu, sollen die \textsl{Befehle3} ausgeführt werden.
|
||||
\begin{sybox}
|
||||
\texttt{if }\textsl{Bedingung1} \\
|
||||
\texttt{then }\textsl{Befehle1} \\
|
||||
\textsl{[}\texttt{ elif }\textsl{Bedingung2} \\
|
||||
\hspace*{1em}\texttt{then }\textsl{Befehle2 ]} \\
|
||||
\hspace*{1em}\texttt{\vdots} \\
|
||||
\textsl{[}\texttt{ else }\textsl{Befehle3 ]} \\
|
||||
\texttt{fi}
|
||||
\end{sybox}
|
||||
|
||||
Bedingungen werden normalerweise mit dem Befehl \texttt{test}\index{test=\texttt{test}} (siehe unter \ref{bedingungen}) formuliert. Es kann aber auch der Rückgabewert\footnote{Siehe unter \ref{exitcode}.}\index{Rückgabewert} jedes anderen Kommandos ausgewertet werden. Für Bedingungen, die auf jeden Fall zutreffen sollen steht der Null-Befehl (\texttt{:}, siehe unter \ref{null-befehl}) zur Verfügung.
|
||||
Wenn die \textsl{Bedingung1} erfüllt ist, werden die \textsl{Befehle1}
|
||||
ausgeführt; andernfalls, wenn die \textsl{Bedingung2} erfüllt ist, werden die
|
||||
\textsl{Befehle2} ausgeführt. Trifft keine Bedingung zu, sollen die
|
||||
\textsl{Befehle3} ausgeführt werden.
|
||||
|
||||
Bedingungen werden normalerweise mit dem Befehl
|
||||
\texttt{test}\index{test=\texttt{test}} (siehe unter \ref{bedingungen})
|
||||
formuliert. Es kann aber auch der Rückgabewert\footnote{Siehe unter
|
||||
\ref{exitcode}.}\index{Rückgabewert} jedes anderen Kommandos ausgewertet
|
||||
werden. Für Bedingungen, die auf jeden Fall zutreffen sollen steht der
|
||||
Null-Befehl (\texttt{:}, siehe unter \ref{null-befehl}) zur Verfügung.
|
||||
|
||||
\medskip\emph{Beispiele:} Man achte auf die Positionierung der Semikola\footnote{Und man verzeihe mir einen eventuell falschen Plural\ldots :-)}.\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_beisp_if.tex}
|
||||
|
||||
\begin{lstlisting}
|
||||
# Fuege eine 0 vor Zahlen kleiner 10 ein:
|
||||
if [ $counter -lt 10 ]; then
|
||||
number=0$counter
|
||||
else
|
||||
number=$counter;
|
||||
fi
|
||||
|
||||
# Loesche ein Verzeichnis, wenn es existiert:
|
||||
if [ -d $dir ]; then
|
||||
rmdir $dir # rmdir: Verzeichnis loeschen
|
||||
fi
|
||||
\end{lstlisting}
|
||||
|
||||
\index{if=\texttt{if}|)}
|
||||
|
||||
|
||||
@@ -624,14 +717,54 @@ Bedingungen werden normalerweise mit dem Befehl \texttt{test}\index{test=\texttt
|
||||
Auch die \texttt{case}-Anweisung ist vergleichbar in vielen anderen Sprachen vorhanden. Sie dient, ähnlich wie die \texttt{if}-Anweisung zur Fallunterscheidung\index{Fallunterscheidung|see{case}}\index{Fallunterscheidung|see{if}}. Allerdings wird hier nicht nur zwischen zwei Fällen unterschieden (Entweder / Oder), sondern es sind mehrere Fälle möglich. Man kann die \texttt{case}-Anweisung auch durch eine geschachtelte \texttt{if}-Anweisung völlig umgehen, allerdings ist sie ein elegantes Mittel um den Code lesbar zu halten.
|
||||
|
||||
Die Syntax der \texttt{case}-Anweisung lautet wie folgt:\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_case.tex}
|
||||
|
||||
Wenn der \textsl{Wert} mit dem \textsl{Muster1} übereinstimmt, wird die entsprechende Befehlsfolge\index{Befehls>-folge} (\textsl{Befehle1}) ausgeführt, bei Übereinstimmung mit \textsl{Muster2} werden die Kommandos der zweiten Befehlsfolge\index{Befehls>-folge} (\textsl{Befehle2}) ausgeführt, usw. Der letzte Befehl in jeder Gruppe muß mit \texttt{;;} gekennzeichnet werden. Das bedeutet für die Shell soviel wie `springe zum nächsten \texttt{esac}', so daß die anderen Bedingungen nicht mehr überprüft werden.
|
||||
\begin{sybox}
|
||||
\texttt{case }\textsl{Wert}\texttt{ in} \\
|
||||
\hspace*{1em}\textsl{Muster1}\texttt{) }\textsl{Befehle1}\texttt{;;} \\
|
||||
\hspace*{1em}\textsl{Muster2}\texttt{) }\textsl{Befehle2}\texttt{;;} \\
|
||||
\hspace*{1em}\texttt{\vdots} \\
|
||||
\texttt{esac} \\
|
||||
\end{sybox}
|
||||
|
||||
In den Mustern sind die gleichen Meta-Zeichen\index{Meta-Zeichen} erlaubt wie bei der Auswahl von Dateinamen. Das bedeutet, daß man durch ein einfaches \texttt{*}\index{*=\texttt{*}} den Default-Pfad kennzeichnen kann. Dieser wird dann durchlaufen, wenn kein anderes Muster zutrifft. Wenn in einer Zeile mehrere Muster angegeben werden sollen, müssen sie durch ein Pipezeichen (\texttt{|}, logisches ODER) getrennt werden.
|
||||
Wenn der \textsl{Wert} mit dem \textsl{Muster1} übereinstimmt, wird die
|
||||
entsprechende Befehlsfolge\index{Befehls>-folge} (\textsl{Befehle1})
|
||||
ausgeführt, bei Übereinstimmung mit \textsl{Muster2} werden die Kommandos der
|
||||
zweiten Befehlsfolge\index{Befehls>-folge} (\textsl{Befehle2}) ausgeführt, usw.
|
||||
Der letzte Befehl in jeder Gruppe muß mit \texttt{;;} gekennzeichnet werden.
|
||||
Das bedeutet für die Shell soviel wie `springe zum nächsten \texttt{esac}', so
|
||||
daß die anderen Bedingungen nicht mehr überprüft werden.
|
||||
|
||||
In den Mustern sind die gleichen Meta-Zeichen\index{Meta-Zeichen} erlaubt wie
|
||||
bei der Auswahl von Dateinamen. Das bedeutet, daß man durch ein einfaches
|
||||
\texttt{*}\index{*=\texttt{*}} den Default-Pfad kennzeichnen kann. Dieser wird
|
||||
dann durchlaufen, wenn kein anderes Muster zutrifft. Wenn in einer Zeile
|
||||
mehrere Muster angegeben werden sollen, müssen sie durch ein Pipezeichen
|
||||
(\texttt{|}, logisches ODER) getrennt werden.
|
||||
|
||||
\medskip\emph{Beispiele:}\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_beisp_case.tex}
|
||||
|
||||
\begin{lstlisting}
|
||||
# Mit dem ersten Argument in der Befehlszeile wird die entsprechende
|
||||
# Aktion festgelegt:
|
||||
case $1 in # nimmt das erste Argument
|
||||
Ja|Nein) response=1;;
|
||||
-[tT]) table=TRUE;;
|
||||
*) echo "Unbekannte Option"; exit 1;;
|
||||
esac
|
||||
|
||||
# Lies die Zeilen von der Standard-Eingabe, bis eine Zeile mit einem
|
||||
# einzelnen Punkt eingegeben wird:
|
||||
while :; do # Null-Befehl (immer wahr)
|
||||
echo "Zum Beenden . eingeben ==> \c"
|
||||
read line # read: Zeile von StdIn einlesen
|
||||
case "$line" in
|
||||
.) echo "Ausgefuehrt"
|
||||
break;;
|
||||
*) echo "$line";;
|
||||
esac
|
||||
done
|
||||
\end{lstlisting}
|
||||
|
||||
\index{case=\texttt{case}|)}
|
||||
|
||||
|
||||
@@ -648,7 +781,13 @@ trotzdem eine Laufvariable\index{Laufvariable} braucht, mu
|
||||
\ref{while}).}.
|
||||
|
||||
Die Syntax der \texttt{for}-Schleife lautet wie folgt:\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_for.tex}
|
||||
|
||||
\begin{sybox}
|
||||
\texttt{for }\textsl{x [}\texttt{ in }\textsl{Liste ]} \\
|
||||
\texttt{do} \\
|
||||
\hspace*{1em}\textsl{Befehle} \\
|
||||
\texttt{done}
|
||||
\end{sybox}
|
||||
|
||||
Die \textsl{Befehle} werden ausgeführt, wobei der Variablen \textsl{x}
|
||||
nacheinander die Werte aus der \textsl{Liste} zugewiesen werden. Wie man sieht
|
||||
@@ -661,21 +800,67 @@ Kommandos \texttt{continue}\index{continue=\texttt{continue}} (\ref{continue})
|
||||
bzw. \texttt{break}\index{break=\texttt{break}} (\ref{break}) benutzt werden.
|
||||
|
||||
\medskip\emph{Beispiele:}\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_beisp_for.tex}
|
||||
|
||||
\begin{lstlisting}
|
||||
# Seitenweises Formatieren der Dateien, die auf der Befehlszeile
|
||||
# angegeben wurden, und speichern des jeweiligen Ergebnisses:
|
||||
for file do
|
||||
pr $file > $file.tmp # pr: Formatiert Textdateien
|
||||
done
|
||||
|
||||
# Durchsuche Kapitel zur Erstellung einer Wortliste (wie fgrep -f):
|
||||
for item in `cat program_list` # cat: Datei ausgeben
|
||||
do
|
||||
echo "Pruefung der Kapitel auf"
|
||||
echo "Referenzen zum Programm $item ..."
|
||||
grep -c "$item.[co]" chap* # grep: nach Muster suchen
|
||||
done
|
||||
|
||||
# Ermittle einen Ein-Wort-Titel aus jeder Datei und verwende ihn
|
||||
# als neuen Dateinamen:
|
||||
for file do
|
||||
name=`sed -n 's/NAME: //p' $file`
|
||||
# sed: Skriptsprache zur Textformatierung
|
||||
mv $file $name # mv: Datei verschieben bzw. umbenennen
|
||||
done
|
||||
\end{lstlisting}
|
||||
|
||||
\index{for=\texttt{for}|)}
|
||||
|
||||
|
||||
\subsection{while\ldots}\label{while}\index{while=\texttt{while}|(textbf}\index{Schleife>while-=\texttt{while}-|see{while}}
|
||||
|
||||
Die \texttt{while}-Schleife ist wieder ein Konstrukt, das einem aus vielen anderen Sprachen bekannt ist: die Kopfgesteuerte Schleife.
|
||||
Die \texttt{while}-Schleife ist wieder ein Konstrukt, das einem aus vielen
|
||||
anderen Sprachen bekannt ist: die Kopfgesteuerte Schleife.
|
||||
|
||||
Die Syntax der \texttt{while}-Schleife lautet wie folgt:\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_while.tex}
|
||||
|
||||
Die \textsl{Befehle} werden so lange ausgeführt, wie die \textsl{Bedingung} erfüllt ist. Dabei wird die \textsl{Bedingung} vor der Ausführung der \textsl{Befehle} überprüft. Die \textsl{Bedingung} wird dabei üblicherweise, genau wie bei der \texttt{if}-Anweisung, mit mit dem Befehl \texttt{test}\index{test=\texttt{test}} (siehe unter \ref{bedingungen}) formuliert. Wenn die Ausführung eines Schleifendurchlaufs bzw der ganzen Schleife abgebrochen werden soll, müssen die Kommandos \texttt{continue}\index{continue=\texttt{continue}} (\ref{continue}) bzw. \texttt{break}\index{break=\texttt{break}} (\ref{break}) benutzt werden.
|
||||
\begin{sybox}
|
||||
\texttt{while }\textsl{Bedingung}\texttt{; do} \\
|
||||
\hspace*{1em}\textsl{Befehle} \\
|
||||
\texttt{done}
|
||||
\end{sybox}
|
||||
|
||||
Die \textsl{Befehle} werden so lange ausgeführt, wie die \textsl{Bedingung}
|
||||
erfüllt ist. Dabei wird die \textsl{Bedingung} vor der Ausführung der
|
||||
\textsl{Befehle} überprüft. Die \textsl{Bedingung} wird dabei üblicherweise,
|
||||
genau wie bei der \texttt{if}-Anweisung, mit mit dem Befehl
|
||||
\texttt{test}\index{test=\texttt{test}} (siehe unter \ref{bedingungen})
|
||||
formuliert. Wenn die Ausführung eines Schleifendurchlaufs bzw der ganzen
|
||||
Schleife abgebrochen werden soll, müssen die Kommandos
|
||||
\texttt{continue}\index{continue=\texttt{continue}} (\ref{continue}) bzw.
|
||||
\texttt{break}\index{break=\texttt{break}} (\ref{break}) benutzt werden.
|
||||
|
||||
\medskip\emph{Beispiel:}\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_beisp_while.tex}
|
||||
|
||||
\begin{lstlisting}
|
||||
# Zeilenweise Ausgabe aller Aufrufparameter:
|
||||
while [ -n "$1" ]; do
|
||||
echo $1
|
||||
shift # mit shift werden die Parameter nach
|
||||
# Links geshiftet (aus $2 wird $1)
|
||||
done
|
||||
\end{lstlisting}
|
||||
|
||||
Eine Standard-Anwendung der \texttt{while}-Schleife ist der Ersatz für die
|
||||
Zählschleife\index{Zählschleife}\index{Schleife>Zähl-=Zähl-|see{Zählschleife}}.
|
||||
@@ -688,7 +873,15 @@ das Kommando \texttt{seq} (Siehe Abschnitt \ref{seq}) zur Verf
|
||||
man die Funktion durch geschickte Anwendung der
|
||||
\texttt{while}-Schleife:\nopagebreak
|
||||
|
||||
\LTXtable{\textwidth}{tab_beisp_while_for.tex}
|
||||
\begin{lstlisting}
|
||||
# Ausgabe der Zahlen von 1 bis 100:
|
||||
i=1
|
||||
while [ $i -le 100 ]; do
|
||||
echo $i
|
||||
i=`expr $i + 1`
|
||||
done
|
||||
\end{lstlisting}
|
||||
|
||||
\index{while=\texttt{while}|)}
|
||||
|
||||
|
||||
@@ -702,7 +895,12 @@ Es ist also auch eine kopfgesteuerte Schleife, die allerdings so lange l
|
||||
wie die angegebene Bedingung nicht zutrifft.
|
||||
|
||||
Die Syntax der \texttt{until}-Schleife lautet wie folgt:\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_until.tex}
|
||||
|
||||
\begin{sybox}
|
||||
\texttt{until }\textsl{Bedingung}\texttt{; do} \\
|
||||
\hspace*{1em}\textsl{Befehle} \\
|
||||
\texttt{done}
|
||||
\end{sybox}
|
||||
|
||||
Die \textsl{Bedingung} wird dabei üblicherweise, genau wie bei der
|
||||
\texttt{if}-Anweisung, mit mit dem Befehl
|
||||
@@ -712,33 +910,61 @@ Schleife abgebrochen werden soll, m
|
||||
\texttt{continue}\index{continue=\texttt{continue}} (\ref{continue}) bzw.
|
||||
\texttt{break}\index{break=\texttt{break}} (\ref{break}) benutzt werden.
|
||||
|
||||
\medskip\emph{Beispiel:} Hier wird die Bedingung nicht per \texttt{test} sondern mit dem Rückgabewert\index{Rückgabewert} des Programms \texttt{grep}\index{grep=\texttt{grep}} formuliert.\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_beisp_until.tex}
|
||||
\medskip\emph{Beispiel:} Hier wird die Bedingung nicht per \texttt{test}
|
||||
sondern mit dem Rückgabewert\index{Rückgabewert} des Programms
|
||||
\texttt{grep}\index{grep=\texttt{grep}} formuliert.\nopagebreak
|
||||
|
||||
|
||||
\begin{lstlisting}
|
||||
# Warten, bis sich der Administrator einloggt:
|
||||
until who | grep "root"; do
|
||||
# who: Liste der Benutzer
|
||||
# grep: Suchen nach Muster
|
||||
sleep 2 # sleep: warten
|
||||
done
|
||||
echo "Der Meister ist anwesend"
|
||||
\end{lstlisting}
|
||||
|
||||
\index{until=\texttt{until}|)}
|
||||
|
||||
|
||||
\subsection{continue}\label{continue}\index{continue=\texttt{continue}|(textbf}
|
||||
|
||||
Die Syntax der \texttt{continue}-Anweisung lautet wie folgt:\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_continue.tex}
|
||||
|
||||
Man benutzt \texttt{continue} um die restlichen Befehle in einer Schleife zu überspringen und mit dem nächsten Schleifendurchlauf anzufangen. Wenn der Parameter \textsl{n} angegeben wird, werden \textsl{n} Schleifenebenen übersprungen.
|
||||
\begin{sybox}
|
||||
\texttt{continue }\textsl{[ n ]}
|
||||
\end{sybox}
|
||||
|
||||
Man benutzt \texttt{continue} um die restlichen Befehle in einer Schleife zu
|
||||
überspringen und mit dem nächsten Schleifendurchlauf anzufangen. Wenn der
|
||||
Parameter \textsl{n} angegeben wird, werden \textsl{n} Schleifenebenen
|
||||
übersprungen.
|
||||
|
||||
\index{continue=\texttt{continue}|)}
|
||||
|
||||
|
||||
\subsection{break}\label{break}\index{break=\texttt{break}|(textbf}
|
||||
|
||||
Die Syntax der \texttt{break}-Anweisung lautet wie folgt:\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_break.tex}
|
||||
|
||||
Mit \texttt{break} kann man die innerste Ebene (bzw. \textsl{n} Schleifenebenen) verlassen ohne den Rest der Schleife auszuführen.
|
||||
\begin{sybox}
|
||||
\texttt{break }\textsl{[ n ]}
|
||||
\end{sybox}
|
||||
|
||||
Mit \texttt{break} kann man die innerste Ebene (bzw. \textsl{n}
|
||||
Schleifenebenen) verlassen ohne den Rest der Schleife auszuführen.
|
||||
|
||||
\index{break=\texttt{break}|)}
|
||||
|
||||
|
||||
\subsection{exit}\label{exit}\index{exit=\texttt{exit}|(textbf}
|
||||
|
||||
Die Syntax der \texttt{exit}-Anweisung lautet wie folgt:\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_exit.tex}
|
||||
|
||||
\begin{sybox}
|
||||
\texttt{exit }\textsl{[ n ]}
|
||||
\end{sybox}
|
||||
|
||||
Die \texttt{exit}-Anweisung wird benutzt, um ein Skript zu beenden. Wenn der Parameter \textsl{n} angegeben wird, wird er von dem Skript als Exit-Code zurückgegeben.
|
||||
\index{exit=\texttt{exit}|)}
|
||||
@@ -747,7 +973,10 @@ Die \texttt{exit}-Anweisung wird benutzt, um ein Skript zu beenden. Wenn der Par
|
||||
\subsection{return}\label{return}\index{return=\texttt{return}|(textbf}
|
||||
|
||||
Die Syntax der \texttt{return}-Anweisung lautet wie folgt:\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_return.tex}
|
||||
|
||||
\begin{sybox}
|
||||
\texttt{return }\textsl{[ n ]}
|
||||
\end{sybox}
|
||||
|
||||
Mittels \texttt{return} kann eine Funktion (siehe \ref{funktionen}) einen
|
||||
bestimmten Wert zurückgeben. Anderenfalls wird der Exit-Code des letzten in der
|
||||
@@ -810,11 +1039,26 @@ Zwischen den Dateideskriptoren und einem Umlenkungssymbol darf kein Leerzeichen
|
||||
\LTXtable{\textwidth}{tab_beisp_datenstroeme.tex}
|
||||
|
||||
\medskip\emph{Beispiel eines Here-Dokuments:}\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_beisp_datenstroeme_here-dokument.tex}
|
||||
|
||||
\begin{lstlisting}
|
||||
# Ein Here-Dokument: Nach dem << wird ein sogenannter Delimiter
|
||||
# angegeben. Alle folgenden Zeilen werden an die Standard-Eingabe von
|
||||
# cat übergeben. Der Text wird durch ein erneutes Vorkommen des
|
||||
# Delimiters (einzeln und am Zeilenanfang) beendet.
|
||||
cat << EOF
|
||||
Dieser Text wird zeilenweise ausgegeben,
|
||||
bis ein einzelnes EOF kommt.
|
||||
EOF
|
||||
\end{lstlisting}
|
||||
|
||||
Gerade der Mechanismus mit dem Piping sollte nicht unterschätzt werden. Er dient nicht nur dazu, relativ kleine Texte zwischen Tools hin- und herzureichen. An dem folgenden Beispiel soll die Mächtigkeit dieses kleinen Zeichens gezeigt werden:\nopagebreak
|
||||
|
||||
Es ist mit den passenden Tools unter Unix möglich, eine ganze Audio-CD mit zwei Befehlen an der Kommandozeile zu duplizieren. Das erste Kommando veranlaßt, daß die TOC (Table Of Contents) der CD in die Datei cd.toc geschrieben wird. Das dauert nur wenige Sekunden. Die Pipe steckt im zweiten Befehl. Hier wird der eigentliche Inhalt der CD mit dem Tool `cdparanoia' ausgelesen. Da kein Dateiname angegeben wird, schreibt cdparanoia die Daten auf seine Standard-Ausgabe. Diese wird von dem Brennprogramm `cdrdao' übernommen und in Verbindung mit der TOC `on the fly' auf die CD geschrieben.\label{cdrdao}\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_beisp_datenstroeme_cdparanoia.tex}
|
||||
|
||||
\begin{lstlisting}
|
||||
cdrdao read-toc --datafile - cd.toc
|
||||
cdparanoia -q -R 1- - | cdrdao write --buffers 64 cd.toc
|
||||
\end{lstlisting}
|
||||
|
||||
\index{<=\texttt{<}|)}\index{!>\&=\texttt{!>\&}|)}\index{!>\&-=\texttt{!>\&-}|)}\index{<\&=\texttt{<\&}|)}\index{<\&-=\texttt{<\&-}|)}\index{!>=\texttt{!>}|)}\index{!>!>=\texttt{!>!>}|)}\index{Pipe|)}\index{Dateideskriptor|)}\index{Standard-Eingabe|)}\index{Standard-Ausgabe|)}\index{Standard-Fehlerausgabe|)}\index{Here-Dokument|)textbf}
|
||||
\index{Datenströme|)}
|
||||
|
||||
Reference in New Issue
Block a user