Kleine Verbesserungen, neue Kommandos exec und type.
This commit is contained in:
parent
f72918f75d
commit
577cdbfcd1
@ -201,12 +201,14 @@ Ausgabedatei, bei der zweiten reichen schon einzelne Zeichen. In jedem Fall
|
|||||||
sollte nach dem Auspacken noch einmal mittels \texttt{sum} oder \texttt{md5sum}
|
sollte nach dem Auspacken noch einmal mittels \texttt{sum} oder \texttt{md5sum}
|
||||||
eine Checksumme gezogen und verglichen werden.
|
eine Checksumme gezogen und verglichen werden.
|
||||||
|
|
||||||
\section{Dateien, die es nicht gibt}
|
\section{Dateien, die es nicht gibt}\label{dateien_die_es_nicht_gibt}
|
||||||
|
|
||||||
Eine Eigenart der Behandlung von Dateien unter Unix besteht im Verhalten beim
|
Eine Eigenart der Behandlung von Dateien unter Unix besteht im Verhalten beim
|
||||||
Löschen. Gelöscht wird nämlich zunächst nur der Inode, also die Markierung im
|
Löschen. Gelöscht wird nämlich zunächst nur der Verzeichniseintrag. Der Inode,
|
||||||
Dateisystem unter der die Datei gefunden werden kann. Physikalisch besteht die
|
also die Markierung im Dateisystem unter der die Datei gefunden werden kann,
|
||||||
Datei noch, sie wird lediglich im Verzeichnis nicht mehr angezeigt.
|
besteht weiterhin. Er wird erst dann freigegeben, wenn er nicht mehr
|
||||||
|
referenziert wird. Physikalisch besteht die Datei also noch, sie wird lediglich
|
||||||
|
im Verzeichnis nicht mehr angezeigt.
|
||||||
|
|
||||||
Hat ein Prozeß die Datei noch in irgendeiner Form geöffnet, kann er weiter
|
Hat ein Prozeß die Datei noch in irgendeiner Form geöffnet, kann er weiter
|
||||||
darauf zugreifen. Erst wenn er die Datei schließt ist sie tatsächlich und
|
darauf zugreifen. Erst wenn er die Datei schließt ist sie tatsächlich und
|
||||||
@ -312,7 +314,7 @@ Abschlie
|
|||||||
hat, die Variable nCounter ist mit dem Wert aus der Subshell belegt.
|
hat, die Variable nCounter ist mit dem Wert aus der Subshell belegt.
|
||||||
|
|
||||||
|
|
||||||
\subsection{Dateien gleichzeitig lesen und schreiben}
|
\subsection{Dateien gleichzeitig lesen und schreiben}\label{lesen_und_schreiben}
|
||||||
|
|
||||||
Es kommt vor, daß man eine Datei bearbeiten möchte, die hinterher aber wieder
|
Es kommt vor, daß man eine Datei bearbeiten möchte, die hinterher aber wieder
|
||||||
unter dem gleichen Namen zur Verfügung stehen soll. Beispielsweise sollen alle
|
unter dem gleichen Namen zur Verfügung stehen soll. Beispielsweise sollen alle
|
||||||
|
@ -98,7 +98,7 @@
|
|||||||
\rule{5in}{.04in}\\ \vspace{.25in}
|
\rule{5in}{.04in}\\ \vspace{.25in}
|
||||||
\Huge {\bf SHELL\\ \vspace{.4in} PROGRAMMIERUNG}\\ \vspace{.1in}
|
\Huge {\bf SHELL\\ \vspace{.4in} PROGRAMMIERUNG}\\ \vspace{.1in}
|
||||||
\rule{5in}{.04in}\\ \vspace{.6in}
|
\rule{5in}{.04in}\\ \vspace{.6in}
|
||||||
\large v2.0.0 RC2\\
|
\large v2.0.0 RC3\\
|
||||||
\large \today\\ \vspace{.75in}
|
\large \today\\ \vspace{.75in}
|
||||||
\large von\\ \vspace{.3in}
|
\large von\\ \vspace{.3in}
|
||||||
\LARGE {\bf Ronald Schaten} \\ \vspace{.6in}
|
\LARGE {\bf Ronald Schaten} \\ \vspace{.6in}
|
||||||
|
@ -43,10 +43,13 @@ Standard-Shell\index{Shell>Standard-|see{Bourne-Shell}}\index{Standard-Shell|see
|
|||||||
einfachste Form. Sie bietet schon Mechanismen wie die Umlenkung der Ein- oder
|
einfachste Form. Sie bietet schon Mechanismen wie die Umlenkung der Ein- oder
|
||||||
Ausgaben, Wildcards zur Abkürzung von Dateinamen, Shell-Variablen und einen
|
Ausgaben, Wildcards zur Abkürzung von Dateinamen, Shell-Variablen und einen
|
||||||
Satz interner Befehle zum Schreiben von Shell-Prozeduren. Neuere Versionen
|
Satz interner Befehle zum Schreiben von Shell-Prozeduren. Neuere Versionen
|
||||||
beherrschen auch das Job-Controlling\index{Job-Controlling}. Für die
|
beherrschen auch das Job-Controlling\index{Job-Controlling}.
|
||||||
Entwicklung von Shell-Skripten sollte man sich auf diese Shell beschränken, da
|
|
||||||
sie auf praktisch allen Systemen zur Verfügung steht. So bleiben die Skripte
|
Für die Entwicklung von Shell-Skripten sollte man sich auf diese Shell
|
||||||
portabel.
|
beschränken, da sie auf praktisch allen Systemen zur Verfügung steht. So
|
||||||
|
bleiben die Skripte mit kleinen Einschränkungen\footnote{Die verschiedenen
|
||||||
|
Implementierungen weisen kleine Unterschiede, z. B. bei der Behandlung von \$@
|
||||||
|
oder den Parametern von \texttt{read} (-r) auf.} portabel.
|
||||||
|
|
||||||
\item Die
|
\item Die
|
||||||
Korn-Shell\index{Korn-Shell|textbf}\index{Shell>Korn-|see{Korn-Shell}}
|
Korn-Shell\index{Korn-Shell|textbf}\index{Shell>Korn-|see{Korn-Shell}}
|
||||||
@ -64,6 +67,9 @@ kann}\index{Job-Controlling}. Au
|
|||||||
fast allen anderen Shells die Möglichkeit, Aliase und Shell-Funktionen an
|
fast allen anderen Shells die Möglichkeit, Aliase und Shell-Funktionen an
|
||||||
Subshells zu vererben.
|
Subshells zu vererben.
|
||||||
|
|
||||||
|
Die Korn-Shell existiert in verschiedenen Implementierungen, sowohl kommerziell
|
||||||
|
(ksh88), kostenlos (ksh93) als auch frei (pdksh).
|
||||||
|
|
||||||
\item Die C-Shell \index{C-Shell|textbf}\index{Shell>C-|see{C-Shell}}
|
\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
|
(\texttt{csh}\index{csh=\texttt{csh}|see{C-Shell}}) bietet ähnliche
|
||||||
Annehmlichkeiten wie die Korn-Shell, lehnt sich aber in der Syntax sehr stark
|
Annehmlichkeiten wie die Korn-Shell, lehnt sich aber in der Syntax sehr stark
|
||||||
|
@ -134,6 +134,7 @@ Datei kann viel mehr sein als nur ein paar Daten im Filesystem.
|
|||||||
\item \texttt{rm} (\ref{rm}): Dateien löschen
|
\item \texttt{rm} (\ref{rm}): Dateien löschen
|
||||||
\item \texttt{rmdir} (\ref{rmdir}): Verzeichnisse löschen
|
\item \texttt{rmdir} (\ref{rmdir}): Verzeichnisse löschen
|
||||||
\item \texttt{touch} (\ref{touch}): Eine leere Datei anlegen, bzw. das Zugriffsdatum einer Datei ändern
|
\item \texttt{touch} (\ref{touch}): Eine leere Datei anlegen, bzw. das Zugriffsdatum einer Datei ändern
|
||||||
|
\item \texttt{type} (\ref{type}): Art eines Kommandos feststellen
|
||||||
\item \texttt{which} (\ref{which}): Ausführbare Dateien suchen
|
\item \texttt{which} (\ref{which}): Ausführbare Dateien suchen
|
||||||
\item \texttt{xargs} (\ref{xargs}): Ausgaben eines Kommandos als Parameter eines anderen Kommandos benutzen
|
\item \texttt{xargs} (\ref{xargs}): Ausgaben eines Kommandos als Parameter eines anderen Kommandos benutzen
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
@ -161,6 +162,7 @@ kleinsten geeigneten Hammer nehmen.
|
|||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item \texttt{awk} (\ref{awk}): In einer Pipe editieren
|
\item \texttt{awk} (\ref{awk}): In einer Pipe editieren
|
||||||
\item \texttt{cut} (\ref{cut}): Teile einer Zeile ausschneiden
|
\item \texttt{cut} (\ref{cut}): Teile einer Zeile ausschneiden
|
||||||
|
\item \texttt{exec} (\ref{exec}): Dateideskriptoren umhängen
|
||||||
\item \texttt{grep} (\ref{grep}): In einer Pipe suchen
|
\item \texttt{grep} (\ref{grep}): In einer Pipe suchen
|
||||||
\item \texttt{sed} (\ref{sed}): In einer Pipe editieren
|
\item \texttt{sed} (\ref{sed}): In einer Pipe editieren
|
||||||
\item \texttt{sort} (\ref{sort}): Zeilenweises Sortieren
|
\item \texttt{sort} (\ref{sort}): Zeilenweises Sortieren
|
||||||
@ -185,6 +187,7 @@ F
|
|||||||
Verfügung.
|
Verfügung.
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
|
\item \texttt{exec} (\ref{exec}): Kommandos ausführen
|
||||||
\item \texttt{kill} (\ref{kill}): Signal an einen Prozeß schicken
|
\item \texttt{kill} (\ref{kill}): Signal an einen Prozeß schicken
|
||||||
\item \texttt{killall} (\ref{killall}): Signal an mehrere Prozesse schicken
|
\item \texttt{killall} (\ref{killall}): Signal an mehrere Prozesse schicken
|
||||||
\item \texttt{ps} (\ref{ps}): Prozeßliste ausgeben
|
\item \texttt{ps} (\ref{ps}): Prozeßliste ausgeben
|
||||||
@ -400,8 +403,11 @@ k
|
|||||||
verkettet werden.
|
verkettet werden.
|
||||||
|
|
||||||
Außerdem kann man mit einem Aufruf in der Art
|
Außerdem kann man mit einem Aufruf in der Art
|
||||||
\lstinline|cat datei.txt | kommando| Daten an ein Programm übergeben, das nur
|
\lstinline!cat datei.txt | kommando! Daten an ein Programm übergeben, das nur
|
||||||
von der Standardeingabe lesen kann (Filter).
|
von der Standardeingabe lesen kann (Filter). Das geht zwar auch durch eine
|
||||||
|
Umleitung (siehe Abschnitt \ref{datenstrom}), wird aber in dieser Form von
|
||||||
|
vielen als lesbarer angesehen. Vorteil der Umleitungs-Methode ist, daß nicht
|
||||||
|
erst ein externes Kommando ausgeführt werden muß.
|
||||||
|
|
||||||
\begin{dinglist}{43}
|
\begin{dinglist}{43}
|
||||||
\item GNU-\texttt{cat} verfügt über eine Reihe von Parametern, um die Ausgabe
|
\item GNU-\texttt{cat} verfügt über eine Reihe von Parametern, um die Ausgabe
|
||||||
@ -667,6 +673,12 @@ der Praxis oft als sehr hilfreich:
|
|||||||
|
|
||||||
\LTXtable{\textwidth}{tab_kommandos_echo_parameter.tex}
|
\LTXtable{\textwidth}{tab_kommandos_echo_parameter.tex}
|
||||||
|
|
||||||
|
\begin{dinglist}{43}
|
||||||
|
\item Die Steuerzeichen, die nach einem \texttt{-e} angegeben werden können
|
||||||
|
sind nicht in allen Shells gleich. Das sollte berücksichtigt werden, wenn das
|
||||||
|
Skript portabel bleiben soll.
|
||||||
|
\end{dinglist}
|
||||||
|
|
||||||
\index{echo=\texttt{echo}|)}
|
\index{echo=\texttt{echo}|)}
|
||||||
|
|
||||||
|
|
||||||
@ -697,6 +709,28 @@ Array-Elementes ausgegeben werden:
|
|||||||
\index{eval=\texttt{eval}|)}
|
\index{eval=\texttt{eval}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{exec}\label{exec}\index{exec=\texttt{exec}|(textbf}
|
||||||
|
|
||||||
|
Dieses Kommando hat zwei wesentliche Einsatzgebiete:
|
||||||
|
|
||||||
|
Wenn das laufende Skript nur benutzt wird um ein anderes Programm zu starten,
|
||||||
|
beispielsweise um die Umgebungsvariablen geeignet zu belegen, sollte das
|
||||||
|
Programm mit \texttt{exec} ausgeführt werden. Der Effekt ist, daß sich die
|
||||||
|
Shell in der das Skript ausgeführt wird beendet und die Kontrolle vollständig
|
||||||
|
an das neue Programm übergibt. So vermeidet man einen überflüssigen Prozeß, der
|
||||||
|
lediglich auf die Beendigung seiner Kinder wartet.
|
||||||
|
|
||||||
|
Der zweite Anwendungsfall ist etwas für den fortgeschrittenen Benutzer: Man
|
||||||
|
kann mit \texttt{exec} Dateideskriptoren umhängen. Damit ist gemeint, daß zum
|
||||||
|
Beispiel die Standardausgabe mittels \lstinline|exec >5| auf den
|
||||||
|
Dateideskriptor mit der Nummer 5 gelegt werden kann. Auf diesem Weg kann mit
|
||||||
|
mehreren Datenströmen jongliert werden. Die Beispiele in Anhang
|
||||||
|
\ref{dateien_die_es_nicht_gibt} verdeutlichen die Anwendung.
|
||||||
|
|
||||||
|
\index{exec=\texttt{exec}|)}
|
||||||
|
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\subsection{expr}\label{expr}\index{expr=\texttt{expr}|(textbf}
|
\subsection{expr}\label{expr}\index{expr=\texttt{expr}|(textbf}
|
||||||
|
|
||||||
@ -792,7 +826,7 @@ f
|
|||||||
|
|
||||||
\textbf{Alternative 2:} Sucht man nach einer ausführbaren Datei, die im Pfad
|
\textbf{Alternative 2:} Sucht man nach einer ausführbaren Datei, die im Pfad
|
||||||
vorhanden ist (`Wo liegt eigentlich Firefox?'), dann sucht man mittels
|
vorhanden ist (`Wo liegt eigentlich Firefox?'), dann sucht man mittels
|
||||||
\texttt{which} (Abschnitt \ref{which}).
|
\texttt{which} (Abschnitt \ref{which}) oder \texttt{type} (\ref{type}).
|
||||||
|
|
||||||
Siehe auch: Abschnitt \ref{beispiele_suchen_dateien}.
|
Siehe auch: Abschnitt \ref{beispiele_suchen_dateien}.
|
||||||
|
|
||||||
@ -1733,14 +1767,28 @@ entkr
|
|||||||
|
|
||||||
\lstinline|trap 'echo "Ctrl-C ist ausser Kraft."' 2|
|
\lstinline|trap 'echo "Ctrl-C ist ausser Kraft."' 2|
|
||||||
|
|
||||||
Eine Sonderbehandlung macht die Shell, wenn als Signal \texttt{DEBUG} angegeben
|
Eine Sonderbehandlung machen viele Shells, wenn als Signal \texttt{DEBUG}
|
||||||
wird. Dann wird nach jedem ausgeführten Kommando der Trap ausgelöst. Dieses
|
angegeben wird. Dann wird nach jedem ausgeführten Kommando der Trap ausgelöst.
|
||||||
Feature wird wie der Name schon erahnen läßt zum Debuggen benutzt, ein Beispiel
|
Dieses Feature wird wie der Name schon erahnen läßt zum Debuggen benutzt, ein
|
||||||
findet sich in Abschnitt \ref{fehlersuche}.
|
Beispiel findet sich in Abschnitt \ref{fehlersuche}.
|
||||||
|
|
||||||
\index{trap=\texttt{trap}|)}
|
\index{trap=\texttt{trap}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{type}\label{type}\index{type=\texttt{type}|(textbf}
|
||||||
|
|
||||||
|
Das in die Shell eingebaute Kommando \texttt{type} gibt Auskunft über die Art
|
||||||
|
eines ausführbaren Kommandos. So kann man herausfinden ob beim Absetzen des
|
||||||
|
Befehls ein externes Programm gestartet, eine Shell-Funktion ausgeführt oder
|
||||||
|
ein Alias benutzt wird.
|
||||||
|
|
||||||
|
Sucht man nur nach einer ausführbaren Datei, hilft \texttt{which} (Abschnitt
|
||||||
|
\ref{which}).
|
||||||
|
|
||||||
|
\index{type=\texttt{type}|)}
|
||||||
|
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\subsection{uniq}\label{uniq}\index{uniq=\texttt{uniq}|(textbf}
|
\subsection{uniq}\label{uniq}\index{uniq=\texttt{uniq}|(textbf}
|
||||||
|
|
||||||
@ -1813,6 +1861,8 @@ Dateien auf das Suchwort passen wird die erste Fundstelle ausgegeben, also die
|
|||||||
Datei die tatsächlich ausgeführt würde. Mit \texttt{-a} werden alle Fundstellen
|
Datei die tatsächlich ausgeführt würde. Mit \texttt{-a} werden alle Fundstellen
|
||||||
ausgegeben.
|
ausgegeben.
|
||||||
|
|
||||||
|
Einen ähnlichen Zweck erfüllt auch \texttt{type} (Abschnitt \ref{type}).
|
||||||
|
|
||||||
\index{which=\texttt{which}|)}
|
\index{which=\texttt{which}|)}
|
||||||
|
|
||||||
|
|
||||||
|
@ -555,10 +555,10 @@ unter \lstinline|/bin/sh| die entsprechende Shell (in diesem Fall die
|
|||||||
Bourne-Shell) liegt. Dieser Eintrag wirkt nur dann, wenn er in der ersten Zeile
|
Bourne-Shell) liegt. Dieser Eintrag wirkt nur dann, wenn er in der ersten Zeile
|
||||||
und der ersten Spalte des Skripts steht.
|
und der ersten Spalte des Skripts steht.
|
||||||
|
|
||||||
Dieser Mechanismus ist bei der Bourne-Shell nicht vorhanden, er wurde mit den
|
Dieser Mechanismus wurde mit dem Aufkommen modernerer Shells eingeführt um eben
|
||||||
moderneren Shells eingeführt um eben durch die Angabe von \lstinline|#!/bin/sh|
|
durch die Angabe von \lstinline|#!/bin/sh| die Bourne-Shell für die Ausführung
|
||||||
die Bourne-Shell für die Ausführung von Shell-Skripten benutzen zu können. In
|
von Shell-Skripten benutzen zu können. Interpretiert wird die Zeile vom Kernel,
|
||||||
der Bourne-Shell wirkt das führende \verb\#\ als Kommentarzeichen.
|
in der Shell selbst wirkt das führende \verb\#\ als Kommentarzeichen.
|
||||||
|
|
||||||
\index{Shell>Auswahl der\ldots|)}
|
\index{Shell>Auswahl der\ldots|)}
|
||||||
|
|
||||||
@ -629,21 +629,24 @@ count () {
|
|||||||
|
|
||||||
\subsection{Bedingungen (\texttt{[ ]})}\label{bedingungen}\index{Bedingungen|see{test}}\index{[ ]=\texttt{[ ]}|see{test}}\index{test=\texttt{test}|(textbf}
|
\subsection{Bedingungen (\texttt{[ ]})}\label{bedingungen}\index{Bedingungen|see{test}}\index{[ ]=\texttt{[ ]}|see{test}}\index{test=\texttt{test}|(textbf}
|
||||||
|
|
||||||
Da die Standard-Shell keine arithmetischen oder logischen Ausdrücke auswerten
|
Ursprünglich konnte die Standard-Shell keine arithmetischen oder logischen
|
||||||
kann\footnote{\texttt{if} und Konsorten prüfen nur den
|
Ausdrücke auswerten\footnote{\texttt{if} und Konsorten prüfen nur den
|
||||||
Rückgabewert\index{Rückgabewert} eines aufgerufenen Programmes~--~0 bedeutet
|
Rückgabewert\index{Rückgabewert} eines aufgerufenen Programmes~--~0 bedeutet
|
||||||
`true', alles andere bedeutet `false', siehe auch \ref{exitcode}.}, muß dazu
|
`true', alles andere bedeutet `false', siehe auch \ref{exitcode}.}. Für diese
|
||||||
ein externes Programm benutzt werden. Dieses Programm heißt
|
Aufgabe mußte ein externes Programm benutzt werden, heutzutage ist der Befehl
|
||||||
\verb\test\\index{test=\texttt{test}}. Üblicherweise besteht auf allen Systemen
|
in die Shell integriert.
|
||||||
auch noch ein Link namens \verb\[\ auf dieses Programm. Dieser Link ist fast
|
|
||||||
absolut gleichwertig zu benutzen (in dieser Form wird allerdings eine
|
|
||||||
abschließende Klammer nach der Bedingung erwartet). Dementsprechend ist es auch
|
|
||||||
zwingend erforderlich, nach der Klammer ein Leerzeichen zu schreiben. Das dient
|
|
||||||
dazu, Bedingungen in \verb\if\-Abfragen u. ä. lesbarer zu machen.
|
|
||||||
|
|
||||||
Das \verb\test\-Programm bietet sehr umfangreiche Optionen an. Dazu gehören
|
Dieser Befehl heißt \verb\test\\index{test=\texttt{test}}. Üblicherweise
|
||||||
Dateitests und Vergleiche von Zeichenfolgen oder ganzen Zahlen. Diese
|
steht er auf allen Systemen auch noch unter dem Namen \verb\[\ zur Verfügung.
|
||||||
Bedingungen können auch durch Verknüpfungen kombiniert werden.
|
Diese Variante ist fast absolut gleichwertig zu benutzen (in dieser Form wird
|
||||||
|
allerdings eine abschließende Klammer nach der Bedingung erwartet).
|
||||||
|
Dementsprechend ist es auch zwingend erforderlich, nach der Klammer ein
|
||||||
|
Leerzeichen zu schreiben. Das dient dazu, Bedingungen in \verb\if\-Abfragen u.
|
||||||
|
ä. lesbarer zu machen.
|
||||||
|
|
||||||
|
\verb\test\ bietet sehr umfangreiche Optionen an. Dazu gehören Dateitests und
|
||||||
|
Vergleiche von Zeichenfolgen oder ganzen Zahlen. Diese Bedingungen können auch
|
||||||
|
durch Verknüpfungen kombiniert werden.
|
||||||
|
|
||||||
\medskip\medskip\emph{Dateitests:}\index{Dateitests}\nopagebreak
|
\medskip\medskip\emph{Dateitests:}\index{Dateitests}\nopagebreak
|
||||||
\LTXtable{\textwidth}{tab_bedingungen_dateitests.tex}
|
\LTXtable{\textwidth}{tab_bedingungen_dateitests.tex}
|
||||||
@ -883,6 +886,35 @@ while [ $i -le 100 ]; do
|
|||||||
done
|
done
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
|
Ein weiterer typischer Anwendungsfall ist das zeilenweise Bearbeiten einer
|
||||||
|
Eingabedatei. Dabei kann es sich entweder um eine einfache Textdatei handeln,
|
||||||
|
oder um die Ausgabe eines anderen Kommandos.
|
||||||
|
|
||||||
|
Um die Ausgabe eines anderen Kommandos zu verarbeiten kann \texttt{while} als
|
||||||
|
Teil einer Pipeline geschrieben werden:
|
||||||
|
|
||||||
|
\begin{lstlisting}
|
||||||
|
# "hallo" suchen und umstaendlich ausgeben:
|
||||||
|
grep "hallo" datei.txt | while read zeile; do
|
||||||
|
echo "Fundstelle: $zeile"
|
||||||
|
done
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
Wenn die Eingabe als Textdatei vorliegt ist es verlockend, diese einfach
|
||||||
|
mittels \texttt{cat} auszugeben und per Pipe in die Schleife zu schicken.
|
||||||
|
Allerdings sollte an dieser Stelle eine Umleitung benutzt werden. So vermeidet
|
||||||
|
man den überflüssigen Start des Kommandos \texttt{cat}:
|
||||||
|
|
||||||
|
\begin{lstlisting}
|
||||||
|
# Zahlen aus einer Datei lesen und aufsummieren:
|
||||||
|
summe=0
|
||||||
|
while read zeile; do
|
||||||
|
summe=`expr $summe + $zeile`
|
||||||
|
done < datei.txt
|
||||||
|
echo "Summe: $summe"
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
|
||||||
\index{while=\texttt{while}|)}
|
\index{while=\texttt{while}|)}
|
||||||
|
|
||||||
|
|
||||||
@ -989,7 +1021,9 @@ Funktion ausgef
|
|||||||
\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{\&}|(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.}}
|
\index{!|=\texttt{!|}|see{Pipe}}\index{Substitution|see{Befehls-Subst.}}
|
||||||
|
|
||||||
Es gibt eine Reihe verschiedener Möglichkeiten, Kommandos auszuführen:\nopagebreak
|
Es gibt eine Reihe verschiedener Möglichkeiten, Kommandos auszuführen. So
|
||||||
|
kommen Verkettungen, Abhängigkeiten und Gruppierungen zustande:\nopagebreak
|
||||||
|
|
||||||
\LTXtable{\textwidth}{tab_befehlsformen.tex}
|
\LTXtable{\textwidth}{tab_befehlsformen.tex}
|
||||||
|
|
||||||
\medskip\emph{Beispiele:}\nopagebreak
|
\medskip\emph{Beispiele:}\nopagebreak
|
||||||
|
Loading…
Reference in New Issue
Block a user