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 <20>ber \lstinline|sh -v ./skriptname| funktioniert. Diese Option gibt jede
|
||||
Zeile vor der Ausf<73>hrung aus, allerdings im Gegensatz zu \texttt{-x} nicht in
|
||||
der expandierten sondern in der vollen Form.
|
||||
Aufruf von der Kommandozeile <EFBFBD>ber \lstinline|sh -v ./skriptname| funktioniert.
|
||||
Diese Option gibt jede Zeile vor der Ausf<73>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<EFBFBD>ckgabewert, der Auskunft <20>ber Erfolg oder Mi<4D>erfolg gibt (siehe Abschnitt
|
||||
@ -152,13 +152,22 @@ der Variable \texttt{\$?}\index{\$?=\texttt{\$?}} abgelegt.
|
||||
Programme den Wert 0 zur<75>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<65>scht wird:
|
||||
|
||||
\LTXtable{\textwidth}{tab_beisp_exitcode_lpr.tex}
|
||||
\lstinline/$ lpr datei && rm datei/\index{\&\&=\texttt{\&\&}}
|
||||
|
||||
N<EFBFBD>heres zur Verkn<6B>pfung von Aufrufen steht im Kapitel <20>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<63>tzen" Anf<6E>hrungszeichen'
|
||||
Ticks "sch<63>tzen" Anf<6E>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<EFBFBD>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<73>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<64> Hidden Files (Dateien, deren Name mit einem Punkt
|
||||
beginnt) nicht durch ein einfaches \texttt{*} erfa<66>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<61>er den Status 0 zur<75>ckzugeben. Er wird benutzt, um Endlosschleifen\index{Endlosschleife} zu schreiben (siehe unter \ref{while}), oder um leere Bl<42>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<61>er den Status 0 zur<75>ckzugeben. Er wird benutzt, um
|
||||
Endlosschleifen\index{Endlosschleife} zu schreiben (siehe unter \ref{while}),
|
||||
oder um leere Bl<42>cke in \texttt{if}- oder
|
||||
\texttt{case}-Konstrukten\index{if=\texttt{if}}\index{case=\texttt{case}}
|
||||
m<EFBFBD>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<62>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<62>ngig.
|
||||
|
||||
Die Syntax der \texttt{if}-Anweisung lautet wie folgt:\nopagebreak
|
||||
\LTXtable{\textwidth}{tab_if.tex}
|
||||
|
||||
Wenn die \textsl{Bedingung1} erf<72>llt ist, werden die \textsl{Befehle1} ausgef<65>hrt; andernfalls, wenn die \textsl{Bedingung2} erf<72>llt ist, werden die \textsl{Befehle2} ausgef<65>hrt. Trifft keine Bedingung zu, sollen die \textsl{Befehle3} ausgef<65>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<EFBFBD>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<72>gung.
|
||||
Wenn die \textsl{Bedingung1} erf<72>llt ist, werden die \textsl{Befehle1}
|
||||
ausgef<EFBFBD>hrt; andernfalls, wenn die \textsl{Bedingung2} erf<72>llt ist, werden die
|
||||
\textsl{Befehle2} ausgef<65>hrt. Trifft keine Bedingung zu, sollen die
|
||||
\textsl{Befehle3} ausgef<65>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<EFBFBD>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<72>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, <20>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} <20>bereinstimmt, wird die entsprechende Befehlsfolge\index{Befehls>-folge} (\textsl{Befehle1}) ausgef<65>hrt, bei <20>bereinstimmung mit \textsl{Muster2} werden die Kommandos der zweiten Befehlsfolge\index{Befehls>-folge} (\textsl{Befehle2}) ausgef<65>hrt, usw. Der letzte Befehl in jeder Gruppe mu<6D> mit \texttt{;;} gekennzeichnet werden. Das bedeutet f<>r die Shell soviel wie `springe zum n<>chsten \texttt{esac}', so da<64> die anderen Bedingungen nicht mehr <20>berpr<70>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<64> 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} <20>bereinstimmt, wird die
|
||||
entsprechende Befehlsfolge\index{Befehls>-folge} (\textsl{Befehle1})
|
||||
ausgef<EFBFBD>hrt, bei <20>bereinstimmung mit \textsl{Muster2} werden die Kommandos der
|
||||
zweiten Befehlsfolge\index{Befehls>-folge} (\textsl{Befehle2}) ausgef<65>hrt, usw.
|
||||
Der letzte Befehl in jeder Gruppe mu<6D> mit \texttt{;;} gekennzeichnet werden.
|
||||
Das bedeutet f<>r die Shell soviel wie `springe zum n<>chsten \texttt{esac}', so
|
||||
da<EFBFBD> die anderen Bedingungen nicht mehr <20>berpr<70>ft werden.
|
||||
|
||||
In den Mustern sind die gleichen Meta-Zeichen\index{Meta-Zeichen} erlaubt wie
|
||||
bei der Auswahl von Dateinamen. Das bedeutet, da<64> 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<65>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<65>hrt, wie die \textsl{Bedingung} erf<72>llt ist. Dabei wird die \textsl{Bedingung} vor der Ausf<73>hrung der \textsl{Befehle} <20>berpr<70>ft. Die \textsl{Bedingung} wird dabei <20>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<73>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<65>hrt, wie die \textsl{Bedingung}
|
||||
erf<EFBFBD>llt ist. Dabei wird die \textsl{Bedingung} vor der Ausf<73>hrung der
|
||||
\textsl{Befehle} <20>berpr<70>ft. Die \textsl{Bedingung} wird dabei <20>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<73>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<EFBFBD>hlschleife\index{Z<EFBFBD>hlschleife}\index{Schleife>Z<>hl-=Z<EFBFBD>hl-|see{Z<EFBFBD>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 <20>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<EFBFBD>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<EFBFBD>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 <20>berspringen und mit dem n<>chsten Schleifendurchlauf anzufangen. Wenn der Parameter \textsl{n} angegeben wird, werden \textsl{n} Schleifenebenen <20>bersprungen.
|
||||
\begin{sybox}
|
||||
\texttt{continue }\textsl{[ n ]}
|
||||
\end{sybox}
|
||||
|
||||
Man benutzt \texttt{continue} um die restlichen Befehle in einer Schleife zu
|
||||
<EFBFBD>berspringen und mit dem n<>chsten Schleifendurchlauf anzufangen. Wenn der
|
||||
Parameter \textsl{n} angegeben wird, werden \textsl{n} Schleifenebenen
|
||||
<EFBFBD>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<75>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<75>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<75>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<75>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 <20>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<63>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<6C>t, da<64> 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' <20>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<EFBFBD>me|)}
|
||||
|
Reference in New Issue
Block a user