Grundlegende Ueberarbeitung
This commit is contained in:
		| @@ -63,7 +63,8 @@ done | |||||||
| echo Es sind $count Benutzer mit einer ID kleiner 100 eingetragen | echo Es sind $count Benutzer mit einer ID kleiner 100 eingetragen | ||||||
| \end{listing} | \end{listing} | ||||||
| \normalsize | \normalsize | ||||||
| TODO!!! |  | ||||||
|  | TODO!!! Daten aus Subshell hochreichen | ||||||
|  |  | ||||||
| Achtung! while ist eine Subshell - Daten m<>ssen hochgereicht werden. | Achtung! while ist eine Subshell - Daten m<>ssen hochgereicht werden. | ||||||
|  |  | ||||||
| @@ -339,8 +340,7 @@ Wenn \texttt{case} eine andere Parameterzahl feststellt, wird eine Meldung mit d | |||||||
| \index{trap=\texttt{trap}|)}\index{Signal|)} | \index{trap=\texttt{trap}|)}\index{Signal|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \section{Chaoten: Dateien in zuf<75>llige Reihenfolge | \section{Chaoten: Dateien in zuf<75>llige Reihenfolge bringen}\label{chaoten}\index{Zufallszahlen|(} | ||||||
| bringen}\label{chaoten}\index{Zufallszahlen|(} |  | ||||||
|  |  | ||||||
| Wir wollen uns einen MP3-Player programmieren, der Alle MP3-Dateien aus einem | Wir wollen uns einen MP3-Player programmieren, der Alle MP3-Dateien aus einem | ||||||
| bestimmten Verzeichnisbaum in zuf<75>lliger Reihenfolge abspielt. Damit dieses | bestimmten Verzeichnisbaum in zuf<75>lliger Reihenfolge abspielt. Damit dieses | ||||||
| @@ -354,7 +354,7 @@ Das Problem ist, da | |||||||
| k<EFBFBD>nnen. Auf Systemen, in denen die Datei \texttt{/dev/urandom} existiert, | k<EFBFBD>nnen. Auf Systemen, in denen die Datei \texttt{/dev/urandom} existiert, | ||||||
| liefert uns der Kernel aber schon sehr zuf<75>llige Zeichenfolgen. Diese Folgen | liefert uns der Kernel aber schon sehr zuf<75>llige Zeichenfolgen. Diese Folgen | ||||||
| k<EFBFBD>nnen alle Zeichen enthalten, daher m<>ssen sie vor der Benutzung f<>r unsere | k<EFBFBD>nnen alle Zeichen enthalten, daher m<>ssen sie vor der Benutzung f<>r unsere | ||||||
| Zwecke noch etwas 'bereinigt' werden. | Zwecke noch etwas `bereinigt' werden. | ||||||
|  |  | ||||||
| Wie das aussieht, wenn es fertig ist, sieht man im folgenden Skript: | Wie das aussieht, wenn es fertig ist, sieht man im folgenden Skript: | ||||||
|  |  | ||||||
| @@ -379,13 +379,13 @@ ignorieren Gro | |||||||
| \end{listingcont} | \end{listingcont} | ||||||
| \normalsize | \normalsize | ||||||
| \begin{flushright} | \begin{flushright} | ||||||
| Hier ist der 'magische Teil'. Mit dem \texttt{echo} wird die Ausgabe einer Pipe | Hier ist der `magische Teil'. Mit dem \texttt{echo} wird die Ausgabe einer Pipe | ||||||
| ausgegeben, gefolgt von dem aktuellen Dateinamen. Diese Pipe enth<74>lt ein | ausgegeben, gefolgt von dem aktuellen Dateinamen. Diese Pipe enth<74>lt ein | ||||||
| \texttt{tr}, der alle ungewollten Zeichen (alles, was kein Textzeichen ist) aus | \texttt{tr}, der alle ungewollten Zeichen (alles, was kein Textzeichen ist) aus | ||||||
| einem Datenstrom entfernt. Die Daten erh<72>lt \texttt{tr} durch die | einem Datenstrom entfernt. Die Daten erh<72>lt \texttt{tr} durch die | ||||||
| \texttt{<}-Umleitung aus oben genannter Datei. | \texttt{<}-Umleitung aus oben genannter Datei. | ||||||
|  |  | ||||||
| Diese Datei liefert 'ohne Ende' Zeichen. Wir wollen aber nur acht Zeichen | Diese Datei liefert `ohne Ende' Zeichen. Wir wollen aber nur acht Zeichen | ||||||
| haben, die wir unserem Dateinamen voranstellen k<>nnen. Dazu benutzen wir das | haben, die wir unserem Dateinamen voranstellen k<>nnen. Dazu benutzen wir das | ||||||
| Kommando \texttt{dd} mit den angegebenen Parametern. Damit die Erfolgsmeldung | Kommando \texttt{dd} mit den angegebenen Parametern. Damit die Erfolgsmeldung | ||||||
| von \texttt{dd} nicht die Ausgabe verunstaltet, lenken wir sie nach | von \texttt{dd} nicht die Ausgabe verunstaltet, lenken wir sie nach | ||||||
| @@ -424,3 +424,79 @@ done | |||||||
| \end{listingcont} | \end{listingcont} | ||||||
| \normalsize | \normalsize | ||||||
| \index{Zufallszahlen|)} | \index{Zufallszahlen|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | \section{Wer suchet, der findet}\label{beispiele_suchen}\index{grep=\texttt{grep}|(textbf} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | \subsection{Prozesse suchen}\label{beispiele_suchen_prozesse}\index{ps=\texttt{ps}|(textbf}\index{pgrep=\texttt{pgrep}|(textbf} | ||||||
|  |  | ||||||
|  | Im Zusammenhang mit grep st<73><74>t fast jeder Shell-Skripter fr<66>her oder sp<73>ter auf | ||||||
|  | das Problem, da<64> er irgendwas davon abh<62>ngig machen will, ob ein bestimmter | ||||||
|  | Proze<EFBFBD> l<>uft oder nicht. Im Normalfall wird er zuerst folgendes ausprobieren, | ||||||
|  | was aber oft (nicht immer) in die Hose gehen wird: | ||||||
|  |  | ||||||
|  | \texttt{ps aux | grep }\textit{prozessname}\texttt{ \&\& echo \dq}\textit{l<EFBFBD>uft | ||||||
|  | schon}\texttt{\dq} | ||||||
|  |  | ||||||
|  | Der Grund daf<61>r ist, da<64> unter Umst<73>nden in der Ausgabe von \texttt{ps} auch | ||||||
|  | das \texttt{grep}-Kommando samt Parameter (\textit{prozessname}) aufgelistet | ||||||
|  | wird. So findet das \texttt{grep}-Kommando sich quasi selbst. | ||||||
|  |  | ||||||
|  | Abhilfe schafft entweder \texttt{pgrep} (\ref{pgrep}) oder das folgende | ||||||
|  | Konstrukt: | ||||||
|  |  | ||||||
|  | \texttt{ps aux | grep \dq}\textit{[p]rozessname}\texttt{\dq~\&\& echo | ||||||
|  | \dq}\textit{l<EFBFBD>uft schon}\texttt{\dq} | ||||||
|  |  | ||||||
|  | Das p ist jetzt als eine Zeichenmenge (regul<EFBFBD>rer Ausdruck) angegeben worden. | ||||||
|  | Jetzt sucht \texttt{grep} also nach dem String \textit{prozessname}, in der | ||||||
|  | Ausgabe von \texttt{ps} erscheint das \texttt{grep}-Kommando allerdings mit | ||||||
|  | \textit{[p]rozessname} und wird somit ignoriert. | ||||||
|  |  | ||||||
|  | \index{ps=\texttt{ps}|)textbf}\index{pgrep=\texttt{pgrep}|)textbf} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | \subsection{Dateiinhalte suchen}\label{beispiele_suchen_dateien}\index{find=\texttt{find}|(textbf} | ||||||
|  |  | ||||||
|  | Ein weiterer wertvoller Trick, diesmal im Zusammenhang mit \texttt{find} ist | ||||||
|  | folgendes Szenario: Es gibt ein Verzeichnis mit vielen Unterverzeichnissen, | ||||||
|  | <EFBFBD>berall liegen Perl-Skripte und andere Dateien. Gesucht sind alle Dateien, in | ||||||
|  | denen eine Zeile mit dem Inhalt `strict' vorkommt. Man k<>nnte jetzt | ||||||
|  | folgendes versuchen: | ||||||
|  |  | ||||||
|  | \texttt{grep -r strict *} | ||||||
|  |  | ||||||
|  | Das f<>hrt allerdings dazu, da<64> alle Dateien durchsucht werden, nicht nur die | ||||||
|  | Perl-Skripte. Diese tragen nach unserer Konvention\footnote{Perl-Skripte m<>ssen | ||||||
|  | keine spezielle Extension haben, es sei aber um des Beispiels Willen mal | ||||||
|  | angenommen.} die Extension `.pl'. Wir starten also eine rekursive Suche <20>ber | ||||||
|  | alle Dateien, die dem Muster entsprechen: | ||||||
|  |  | ||||||
|  | \texttt{grep -r strict *.pl} | ||||||
|  |  | ||||||
|  | Das f<>hrt wieder nicht zu dem gew<65>nschten Ergebnis. Da die Unterverzeichnisse | ||||||
|  | nicht die Extension `*.pl' tragen, werden sie nicht ber<65>cksichtigt. F<>r die | ||||||
|  | Suche in Unterverzeichnissen ziehen wir \texttt{find} (Siehe Abschnitt | ||||||
|  | \ref{find}) heran: | ||||||
|  |  | ||||||
|  | \texttt{find . -name \textbackslash*.pl -exec grep \{\} \textbackslash;} | ||||||
|  |  | ||||||
|  | Dieser Befehl gibt uns zwar die gefundenen Zeilen aus, nicht aber die Namen der | ||||||
|  | Dateien. Es sieht f<>r \texttt{grep} so aus als ob nur eine Datei durchsucht | ||||||
|  | w<EFBFBD>rde, da besteht keine Notwendigkeit den Namen anzugeben. Das ginge mit dem | ||||||
|  | Parameter \texttt{-l}, allerdings w<>rden uns dann nur noch die Dateinamen | ||||||
|  | angezeigt. Eine Ausgabe mit beiden Informationen erhalten wir mit dem folgenden | ||||||
|  | Konstrukt: | ||||||
|  |  | ||||||
|  | \texttt{find . -name \textbackslash*.pl -exec grep strict /dev/null \{\} \textbackslash;} | ||||||
|  |  | ||||||
|  | Hier durchsucht \texttt{grep} nicht nur die gefundenen Dateien, sondern bei | ||||||
|  | jedem Aufruf auch \texttt{/dev/null}, also den digitalen M<>lleimer der per | ||||||
|  | Definition leer ist. Da es f<>r \texttt{grep} so aussieht als ob mehr als eine | ||||||
|  | Datei durchsucht w<>rden, wird bei jeder Fundstelle sowohl der Dateiname als | ||||||
|  | auch die gefundene Zeile ausgegeben. | ||||||
|  |  | ||||||
|  | \index{find=\texttt{find}|)textbf} | ||||||
|  | \index{grep=\texttt{grep}|)textbf} | ||||||
|   | |||||||
| @@ -8,6 +8,9 @@ | |||||||
| \item Unix In A Nutshell (\texttt{http://www.oreilly.com/catalog/unixnut3/}) | \item Unix In A Nutshell (\texttt{http://www.oreilly.com/catalog/unixnut3/}) | ||||||
| \item Unix Power Tools (\texttt{http://www.oreilly.com/catalog/upt2/}) | \item Unix Power Tools (\texttt{http://www.oreilly.com/catalog/upt2/}) | ||||||
| \item Von DOS nach Linux HOWTO (\texttt{http://www.linuxhaven.de/dlhp/HOWTO/DE-DOS-nach-Linux-HOWTO.html}) | \item Von DOS nach Linux HOWTO (\texttt{http://www.linuxhaven.de/dlhp/HOWTO/DE-DOS-nach-Linux-HOWTO.html}) | ||||||
|  |  | ||||||
|  | TODO!!! Andere URL angeben (http://www.tldp.org...) | ||||||
|  |  | ||||||
| \item ... und eine Menge Skripte, die ich im Laufe der Zeit gelesen habe (das | \item ... und eine Menge Skripte, die ich im Laufe der Zeit gelesen habe (das | ||||||
| kann ich nur jedem empfehlen - es ist spannender als es sich anh<6E>rt...). | kann ich nur jedem empfehlen - es ist spannender als es sich anh<6E>rt...). | ||||||
| \end{itemize} | \end{itemize} | ||||||
|   | |||||||
| @@ -24,28 +24,28 @@ haben. | |||||||
|  |  | ||||||
| \section{Die Tar-Br<42>cke} | \section{Die Tar-Br<42>cke} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! tar-Br<42>cke | ||||||
|  |  | ||||||
|  |  | ||||||
| \section{Binaries inside} | \section{Binaries inside} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! binaries inside | ||||||
|  |  | ||||||
| \subsection{Bin<EFBFBD>re Here-Dokumente} | \subsection{Bin<EFBFBD>re Here-Dokumente} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! bin<69>re Here-Dokumente | ||||||
|  |  | ||||||
| \subsection{Schwanz ab!} | \subsection{Schwanz ab!} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! Schwanz ab | ||||||
|  |  | ||||||
| \section{Dateien, die es nicht gibt} | \section{Dateien, die es nicht gibt} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! Dateien, die es nicht gibt | ||||||
|  |  | ||||||
| \subsection{Speichern in nicht existente Dateien} | \subsection{Speichern in nicht existente Dateien} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! Speichern in nicht existente Dateien | ||||||
|  |  | ||||||
| \subsection{Subshell-Schleifen vermeiden} | \subsection{Subshell-Schleifen vermeiden} | ||||||
|  |  | ||||||
| @@ -83,7 +83,7 @@ nach der Vollendung der Schleife wieder den Wert 0 enth | |||||||
| Das liegt daran, da<64> diese Schleife als Teil einer Pipe in einer Subshell | Das liegt daran, da<64> diese Schleife als Teil einer Pipe in einer Subshell | ||||||
| ausgef<EFBFBD>hrt wird. Die Variable \texttt{\$count} steht damit in der Schleife | ausgef<EFBFBD>hrt wird. Die Variable \texttt{\$count} steht damit in der Schleife | ||||||
| praktisch nur lokal zur Verf<72>gung, sie wird nicht an das umgebende Skript | praktisch nur lokal zur Verf<72>gung, sie wird nicht an das umgebende Skript | ||||||
| 'hochgereicht'. | `hochgereicht'. | ||||||
|  |  | ||||||
| Neben der Methode in \ref{daten_hochreichen} bietet sich hier eine viel | Neben der Methode in \ref{daten_hochreichen} bietet sich hier eine viel | ||||||
| einfachere L<>sung an: | einfachere L<>sung an: | ||||||
| @@ -110,7 +110,7 @@ Standardeingabe der Schleife (und somit auf das \texttt{read}-Kommando) legen. | |||||||
|  |  | ||||||
| \subsection{Daten aus einer Subshell hochreichen}\label{daten_hochreichen} | \subsection{Daten aus einer Subshell hochreichen}\label{daten_hochreichen} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! Daten aus einer Subshell hochreichen | ||||||
|  |  | ||||||
| \subsection{Dateien gleichzeitig lesen und schreiben} | \subsection{Dateien gleichzeitig lesen und schreiben} | ||||||
|  |  | ||||||
| @@ -145,3 +145,8 @@ grep "wichtig" <&3 > "$FILE" | |||||||
|  |  | ||||||
| Allerdings sollte man bei dieser Methode beachten, da<64> man im Falle eines | Allerdings sollte man bei dieser Methode beachten, da<64> man im Falle eines | ||||||
| Fehlers die Quelldaten verliert, da die Datei ja bereits gel<65>scht wurde. | Fehlers die Quelldaten verliert, da die Datei ja bereits gel<65>scht wurde. | ||||||
|  |  | ||||||
|  | \section{Auf der Lauer: Wachhunde} | ||||||
|  |  | ||||||
|  | TODO!!! Auf der Lauer: Wachhunde | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								shell.tex
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								shell.tex
									
									
									
									
									
								
							| @@ -104,15 +104,28 @@ | |||||||
| \thispagestyle{empty}                  % eine Leerseite | \thispagestyle{empty}                  % eine Leerseite | ||||||
| ~\vfill | ~\vfill | ||||||
| \footnotesize | \footnotesize | ||||||
| Copyright \copyright{} 2000-2003 Ronald Schaten (\texttt{ronald@schatenseite.de})\bigskip | Copyright \copyright{} 2000-2004 Ronald Schaten (\texttt{ronald@schatenseite.de})\bigskip | ||||||
|  |  | ||||||
| \texttt{${}$Id${}$}\bigskip | TODO: Vern<72>nftige Lizenz einsetzen!\bigskip | ||||||
|  |  | ||||||
| Die aktuellste Version dieses Dokumentes befindet sich im World Wide Web auf meiner Homepage (\texttt{http://www.schatenseite.de/}).\bigskip | %\texttt{${}$Id${}$}\bigskip | ||||||
|  |  | ||||||
| Dieses Dokument ist entstanden, weil ich f<>r mich selbst eine kompakte <20>bersicht zu diesem Thema haben wollte. Ich beabsichtige nicht, damit in irgendeiner Form Kommerz zu machen. Ich stelle es frei zur Verf<72>gung, in der Hoffnung, da<64> andere Leute daraus vielleicht einen Nutzen ziehen k<>nnen. \textbf{Aber ich <20>bernehme keine Garantie f<>r die Korrektheit der hier dargestellten Dinge.} Mit der Formulierung \textsl{'daraus vielleicht einen Nutzen ziehen k<>nnen'} meine ich nicht, da<64> dieses Dokument~---~oder Teile daraus~---~verkauft werden darf. \textbf{Dieses Dokument darf nur kostenlos weitergegeben werden.}\bigskip | Die aktuellste Version dieses Dokumentes befindet sich im World Wide Web auf | ||||||
|  | meiner Homepage (\texttt{http://www.schatenseite.de/}).\bigskip | ||||||
|  |  | ||||||
| Ich danke folgenden Personen, die mir bei der Durchsicht behilflich waren und durch ihre konstruktive Kritik zu Verbesserungen beigetragen haben (in chronologischer Reihenfolge ihres Eingreifens): | Dieses Dokument ist entstanden, weil ich f<>r mich selbst eine kompakte | ||||||
|  | <EFBFBD>bersicht zu diesem Thema haben wollte. Ich beabsichtige nicht, damit in | ||||||
|  | irgendeiner Form Kommerz zu machen. Ich stelle es frei zur Verf<72>gung, in der | ||||||
|  | Hoffnung, da<64> andere Leute daraus vielleicht einen Nutzen ziehen k<>nnen. | ||||||
|  | \textbf{Aber ich <20>bernehme keine Garantie f<>r die Korrektheit der hier | ||||||
|  | dargestellten Dinge.} Mit der Formulierung \textsl{`daraus vielleicht einen | ||||||
|  | Nutzen ziehen k<>nnen'} meine ich nicht, da<64> dieses Dokument~---~oder Teile | ||||||
|  | daraus~---~verkauft werden darf. \textbf{Dieses Dokument darf nur kostenlos | ||||||
|  | weitergegeben werden.}\bigskip | ||||||
|  |  | ||||||
|  | Ich danke folgenden Personen, die mir bei der Durchsicht behilflich waren und | ||||||
|  | durch ihre konstruktive Kritik zu Verbesserungen beigetragen haben (in | ||||||
|  | chronologischer Reihenfolge ihres Eingreifens): | ||||||
|  |  | ||||||
| \begin{list}{$\bullet$}{\itemsep=-0.5cm} | \begin{list}{$\bullet$}{\itemsep=-0.5cm} | ||||||
| \item J<>rgen Ilse (\texttt{ilse@asys-h.de})\\ | \item J<>rgen Ilse (\texttt{ilse@asys-h.de})\\ | ||||||
| @@ -123,7 +136,9 @@ Ich danke folgenden Personen, die mir bei der Durchsicht behilflich waren und du | |||||||
| \item Kai Th<54>ne (\texttt{kai.thoene@gmx.de})\\ | \item Kai Th<54>ne (\texttt{kai.thoene@gmx.de})\\ | ||||||
| \end{list} | \end{list} | ||||||
|  |  | ||||||
| Und ich bitte alle Leser, auf eventuelle Fehler zu achten und mich darauf aufmerksam zu machen. Auch abgesehen davon freue ich mich <20>ber jede R<>ckmeldung. | Und ich bitte alle Leser, auf eventuelle Fehler zu achten und mich darauf | ||||||
|  | aufmerksam zu machen. Auch abgesehen davon freue ich mich <20>ber jede | ||||||
|  | R<EFBFBD>ckmeldung. | ||||||
| \normalsize | \normalsize | ||||||
| \newpage | \newpage | ||||||
| \pagenumbering{roman} | \pagenumbering{roman} | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ | |||||||
| \texttt{\{ }\textsl{Befehl1}\texttt{ ; }\textsl{Befehl2}\texttt{; \}} & Befehlsblock; alle Befehle werden in der momentanen Shell ausgef<65>hrt, aber die Ausgaben werden behandelt, als ob nur ein Befehl ausgef<65>hrt w<>rde \tabularnewline\STRUT | \texttt{\{ }\textsl{Befehl1}\texttt{ ; }\textsl{Befehl2}\texttt{; \}} & Befehlsblock; alle Befehle werden in der momentanen Shell ausgef<65>hrt, aber die Ausgaben werden behandelt, als ob nur ein Befehl ausgef<65>hrt w<>rde \tabularnewline\STRUT | ||||||
| \textsl{Befehl1}\texttt{ | }\textsl{Befehl2} & Pipe\index{Pipe}, verwendet die Ausgabe von \textsl{Befehl1} als Eingabe f<>r \textsl{Befehl2} \tabularnewline\STRUT | \textsl{Befehl1}\texttt{ | }\textsl{Befehl2} & Pipe\index{Pipe}, verwendet die Ausgabe von \textsl{Befehl1} als Eingabe f<>r \textsl{Befehl2} \tabularnewline\STRUT | ||||||
| \textsl{Befehl1}\texttt{ `}\textsl{Befehl2}\texttt{`} & Befehls-Substitution, verwendet die Ausgabe von \textsl{Befehl2} als Argumente\index{Parameter}\index{Argument|see{Parameter}} f<>r \textsl{Befehl1} \tabularnewline\STRUT | \textsl{Befehl1}\texttt{ `}\textsl{Befehl2}\texttt{`} & Befehls-Substitution, verwendet die Ausgabe von \textsl{Befehl2} als Argumente\index{Parameter}\index{Argument|see{Parameter}} f<>r \textsl{Befehl1} \tabularnewline\STRUT | ||||||
|  | \textsl{Befehl1}\texttt{ \$(}\textsl{Befehl2}\texttt{)} & Befehls-Substitution, andere Schreibweise\tabularnewline\STRUT | ||||||
| \textsl{Befehl1}\texttt{ \&\& }\textsl{Befehl2} & AND\index{AND}, f<>hrt zuerst \textsl{Befehl1} und dann (wenn \textsl{Befehl1} erfolgreich war) \textsl{Befehl2} aus\footnote{Einen <20>hnlichen Mechanismus kennt man aus verschiedenen Programmiersprachen unter dem Begriff \textsl{Kurzschlu<EFBFBD>auswertung}\index{Kurzschlu<EFBFBD>auswertung} bzw. \textsl{lazy evaluation}\index{Lazy Evaluation|see{Kurzschlu<EFBFBD>auswertung}}.} \tabularnewline\STRUT | \textsl{Befehl1}\texttt{ \&\& }\textsl{Befehl2} & AND\index{AND}, f<>hrt zuerst \textsl{Befehl1} und dann (wenn \textsl{Befehl1} erfolgreich war) \textsl{Befehl2} aus\footnote{Einen <20>hnlichen Mechanismus kennt man aus verschiedenen Programmiersprachen unter dem Begriff \textsl{Kurzschlu<EFBFBD>auswertung}\index{Kurzschlu<EFBFBD>auswertung} bzw. \textsl{lazy evaluation}\index{Lazy Evaluation|see{Kurzschlu<EFBFBD>auswertung}}.} \tabularnewline\STRUT | ||||||
| \textsl{Befehl1}\texttt{ || }\textsl{Befehl2} & OR\index{OR}, entweder \textsl{Befehl1} ausf<73>hren oder \textsl{Befehl2} (Wenn \textsl{Befehl1} nicht erfolgreich war) | \textsl{Befehl1}\texttt{ || }\textsl{Befehl2} & OR\index{OR}, entweder \textsl{Befehl1} ausf<73>hren oder \textsl{Befehl2} (Wenn \textsl{Befehl1} nicht erfolgreich war) | ||||||
| \end{longtable} | \end{longtable} | ||||||
|   | |||||||
| @@ -8,14 +8,13 @@ | |||||||
|  \hline |  \hline | ||||||
|  \endlastfoot |  \endlastfoot | ||||||
|  |  | ||||||
| \texttt{-A} \textit{n} & Gibt \textit{n} Zeilen nach einer Fundstelle aus \tabularnewline\STRUT | \texttt{-E} & Benutzt erweiterte regul<75>re Ausdr<EFBFBD>cke \tabularnewline\STRUT | ||||||
| \texttt{-B} \textit{n} & Gibt \textit{n} Zeilen vor einer Fundstelle aus \tabularnewline\STRUT | \texttt{-F} & Der Suchbegriff wird nicht als regul<75>rer Ausdruck, sondern als `fixed String' benutzt \tabularnewline\STRUT | ||||||
| \texttt{-C} & Gibt einen Kontext von zwei Zeilen vor und nach einer Fundstelle aus \tabularnewline\STRUT |  | ||||||
| \texttt{-}\textit{n} & Gibt einen Kontext von \textit{n} Zeilen vor und nach einer Fundstelle aus \tabularnewline\STRUT |  | ||||||
| \texttt{-c} & Gibt f<>r jede durchsuchte Datei die Anzahl der Fundstellen aus \tabularnewline\STRUT | \texttt{-c} & Gibt f<>r jede durchsuchte Datei die Anzahl der Fundstellen aus \tabularnewline\STRUT | ||||||
| \texttt{-h} & Unterdr<EFBFBD>ckt die Angabe der Dateinamen \tabularnewline\STRUT | \texttt{-f} & Liest die Suchbegriffe Zeile f<>r Zeile aus einer Textdatei \tabularnewline\STRUT | ||||||
| \texttt{-i} & Ignoriert die Unterscheidung zwischen Gro<72>- und Kleinschreibung \tabularnewline\STRUT | \texttt{-i} & Ignoriert die Unterscheidung zwischen Gro<72>- und Kleinschreibung \tabularnewline\STRUT | ||||||
| \texttt{-l} & Gibt nur die Dateinamen aus \tabularnewline\STRUT | \texttt{-l} & Gibt nur die Dateinamen aus \tabularnewline\STRUT | ||||||
| \texttt{-n} & Gibt zus<75>tzlich die Zeilennummern der Fundstellen aus \tabularnewline\STRUT | \texttt{-n} & Gibt zus<75>tzlich die Zeilennummern der Fundstellen aus \tabularnewline\STRUT | ||||||
| \texttt{-e} & PLATZHALTER - TODO!!! | \texttt{-q} & Gibt die Fundstellen nicht aus, am Exitcode ist zu erkennen ob etwas gefunden wurde \tabularnewline\STRUT | ||||||
|  | \texttt{-v} & Findet alle Zeilen, in denen das Suchmuster \emph{nicht} vorkommt | ||||||
| \end{longtable} | \end{longtable} | ||||||
|   | |||||||
| @@ -38,7 +38,7 @@ Problem und L | |||||||
| Um sowohl das Finden eines Werkzeugs zu einem gegebenen Problem als auch das | Um sowohl das Finden eines Werkzeugs zu einem gegebenen Problem als auch das | ||||||
| Finden einer Beschreibung zu einem gegebenen Werkzeug zu vereinfachen, und um | Finden einer Beschreibung zu einem gegebenen Werkzeug zu vereinfachen, und um | ||||||
| die oben beschriebene n:m-Beziehung abzubilden, werden hier also zun<75>chst | die oben beschriebene n:m-Beziehung abzubilden, werden hier also zun<75>chst | ||||||
| typische Aufgaben beschrieben. Diese enthalten 'Links' zu den in Frage | typische Aufgaben beschrieben. Diese enthalten `Links' zu den in Frage | ||||||
| kommenden Werkzeugen. Danach gibt es eine alphabetische Aufz<66>hlung der | kommenden Werkzeugen. Danach gibt es eine alphabetische Aufz<66>hlung der | ||||||
| wichtigsten Kommandos. | wichtigsten Kommandos. | ||||||
|  |  | ||||||
| @@ -46,28 +46,52 @@ wichtigsten Kommandos. | |||||||
|  |  | ||||||
| \subsection{Ein- und Ausgabe}\label{ein_und_ausgabe} | \subsection{Ein- und Ausgabe}\label{ein_und_ausgabe} | ||||||
|  |  | ||||||
| Beinahe jedes Skript verwendet in irgendeiner Form die Ein- oder Ausgabe. Sei | Praktisch jedes Skript verwendet in irgendeiner Form die Ein- oder Ausgabe. Sei | ||||||
| es in interaktiver Art auf dem Terminal, oder im Hintergrund auf Dateien. | es in interaktiver Art auf dem Terminal, oder im Hintergrund auf Dateien. | ||||||
| Einige grundlegende Kommandos in diesem Zusammenhang werden hier vorgestellt. |  | ||||||
|  |  | ||||||
| cat | An dieser Stelle sei darauf hingewiesen, da<64> es auf unixoiden Systemen nicht | ||||||
| echo | nur Dateien im Sinne von `ein paar Kilobytes Daten, die irgendwo auf der | ||||||
| head | Festplatte rumliegen' gibt. Vielmehr findet man hier die Ger<65>te des Rechners | ||||||
| printf | als Dateien unter /dev. Der Kernel selbst stellt Schnittstellen in Form von | ||||||
| read | virtuellen Dateien unter /proc (ab Kernel 2.6 auch unter /sys) zur Verf<72>gung. | ||||||
| tail | Und Schlu<6C>endlich k<>nnen Prozesse sich sogenannte Named Pipes\index{Named Pipe} | ||||||
|  | anlegen, in die sie schreiben oder aus denen sie lesen. | ||||||
|  |  | ||||||
|  | Diese Kommandos sind also universell n<>tzlich, nicht nur im Zusammenhang mit | ||||||
|  | Dateien auf der Festplatte. | ||||||
|  |  | ||||||
|  | \begin{itemize} | ||||||
|  | \item \texttt{cat} (\ref{cat}): Dateien einlesen und ausgeben | ||||||
|  | \item \texttt{echo} (\ref{echo}): Daten ausgeben | ||||||
|  | \item \texttt{grep} (\ref{grep}): In Dateien suchen | ||||||
|  | \item \texttt{head} (\ref{head}): Dateianfang ausgeben | ||||||
|  | \item \texttt{printf} (\ref{printf}): formatierte Datenausgabe | ||||||
|  | \item \texttt{read} (\ref{read}): Zeilen einlesen | ||||||
|  | \item \texttt{sort} (\ref{sort}): Zeilenweises Sortieren | ||||||
|  | \item \texttt{tail} (\ref{tail}): Dateiende ausgeben | ||||||
|  | \end{itemize} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{Pfade und Dateien}\label{pfade_und_dateien} | \subsection{Pfade und Dateien}\label{pfade_und_dateien} | ||||||
|  |  | ||||||
| Eine der Hautaufgaben von Shell-Skripten ist nat<61>rlich das Hantieren mit | Eine der Hauptaufgaben von Shell-Skripten ist nat<61>rlich das Hantieren mit | ||||||
| Dateien. In diesem Abschnitt geht es allerdings nicht um den Umgang mit | Dateien. In diesem Abschnitt geht es allerdings nicht um den Umgang mit | ||||||
| Dateiinhalten, sondern vielmehr werden einige n<>tzliche Tools im Umgang mit | Dateiinhalten, sondern vielmehr werden einige n<>tzliche Tools im Umgang mit | ||||||
| Dateien an sich vorgestellt. | Dateien an sich vorgestellt. | ||||||
|  |  | ||||||
| basename | Auch hier gilt nat<61>rlich der Hinweis aus Abschnitt \ref{ein_und_ausgabe}: Eine | ||||||
| dirname | Datei kann viel mehr sein als nur ein paar Daten im Filesystem. | ||||||
| touch |  | ||||||
|  | \begin{itemize} | ||||||
|  | \item \texttt{basename} (\ref{basename}): Den Namen einer Datei (ohne Pfad) ausgeben | ||||||
|  | \item \texttt{cp} (\ref{cp}): Dateien kopieren | ||||||
|  | \item \texttt{dirname} (\ref{dirname}): Den Pfad zu einer Datei (ohne den Namen) ausgeben | ||||||
|  | \item \texttt{find} (\ref{find}): Dateien suchen | ||||||
|  | \item \texttt{mv} (\ref{mv}): Dateien verschieben | ||||||
|  | \item \texttt{rm} (\ref{rm}): Dateien l<>schen | ||||||
|  | \item \texttt{touch} (\ref{touch}): Eine leere Datei anlegen, bzw. das Zugriffsdatum einer Datei <20>ndern | ||||||
|  | \item \texttt{xargs} (\ref{xargs}): Ausgaben eines Kommandos als Parameter eines anderen Kommandos benutzen | ||||||
|  | \end{itemize} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{Pipes manipulieren}\label{pipes_manipulieren}\index{Pipe|(textbf} | \subsection{Pipes manipulieren}\label{pipes_manipulieren}\index{Pipe|(textbf} | ||||||
| @@ -76,53 +100,93 @@ Das Konzept der Pipes (R | |||||||
| (\ref{befehlsformen}) vorgestellt. Im wesentlichen besteht es darin, da<64> Daten | (\ref{befehlsformen}) vorgestellt. Im wesentlichen besteht es darin, da<64> Daten | ||||||
| von einem Programm an ein anderes weitergeleitet werden. Auf diese Weise | von einem Programm an ein anderes weitergeleitet werden. Auf diese Weise | ||||||
| entsteht eine sogenannte \textit{Pipeline}\index{Pipeline} aus mehreren | entsteht eine sogenannte \textit{Pipeline}\index{Pipeline} aus mehreren | ||||||
| Kommandos. | Kommandos. Einige Kommandos sind f<>r den Einsatz in einem solchen Konstrukt | ||||||
|  | pr<EFBFBD>destiniert, obwohl die meisten auch alleine eingesetzt werden k<>nnen. | ||||||
|  |  | ||||||
| Einige Kommandos sind f<>r den Einsatz in einem solchen Konstrukt pr<70>destiniert, | <EFBFBD>brigens gibt es einen goldenen Merksatz f<>r die Auswahl einiger dieser Tools: | ||||||
| obwohl die meisten auch alleine eingesetzt werden k<>nnen. Einige dieser |  | ||||||
| Tools sollen im Folgenden vorgestellt werden. | Benutze nicht \texttt{awk}, wenn Du \texttt{sed} benutzen kannst. Benutze | ||||||
|  | nicht \texttt{sed}, wenn Du \texttt{grep} benutzen kannst. Benutze nicht | ||||||
|  | \texttt{grep}, wenn Du \texttt{cut} benutzen kannst. | ||||||
|  |  | ||||||
|  | Der Grund daf<61>r liegt darin, da<64> diese Programme bei jedem Einsatz gestartet | ||||||
|  | und ausgef<65>hrt werden m<>ssen. Und man sollte sich um der Performance willen den | ||||||
|  | kleinsten geeigneten Hammer nehmen. | ||||||
|  |  | ||||||
|  | \begin{itemize} | ||||||
|  | \item \texttt{cut} (\ref{cut}): Teile einer Zeile ausschneiden | ||||||
|  | \item \texttt{grep} (\ref{grep}): In einer Pipe suchen | ||||||
|  | \item \texttt{sed} (\ref{sed}): In einer Pipe editieren | ||||||
|  | \item \texttt{awk} (\ref{awk}): In einer Pipe editieren | ||||||
|  | \item \texttt{sort} (\ref{sort}): Zeilenweises Sortieren | ||||||
|  | \item \texttt{tee} (\ref{tee}): Datenstrom in einer Datei protokollieren | ||||||
|  | \item \texttt{wc} (\ref{wc}): Zeilen, W<>rter oder Zeichen z<>hlen | ||||||
|  | \end{itemize} | ||||||
|  |  | ||||||
| grep |  | ||||||
| sed |  | ||||||
| awk |  | ||||||
| sort |  | ||||||
| tee |  | ||||||
| wc |  | ||||||
| \index{Pipe|)} | \index{Pipe|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{Proze<EFBFBD>management}\label{prozessmanagement} | \subsection{Proze<EFBFBD>management}\label{prozessmanagement} | ||||||
|  |  | ||||||
| TODO!! | Oft werden Shell-Skripte benutzt um Prozesse zu steuern oder zu <20>berwachen. So | ||||||
|  | werden Systemdienste <20>blicherweise <20>ber die Init-Skripte hoch- oder | ||||||
|  | heruntergefahren. Es ist auch nicht sonderlich schwer, mit einem Skript einen | ||||||
|  | `Wachhund' zu implementieren, der regelm<6C><6D>ig kontrolliert ob ein Proze<7A> noch | ||||||
|  | l<EFBFBD>uft und ihn bei bedarf nachstartet. | ||||||
|  |  | ||||||
| ps | F<EFBFBD>r Aufgaben in diesem Bereich stehen unter anderem die folgenden Kommandos zur | ||||||
| pgrep | Verf<EFBFBD>gung. | ||||||
| pkill |  | ||||||
| kill | \begin{itemize} | ||||||
|  | \item \texttt{kill} (\ref{kill}): Signal an einen Proze<7A> schicken | ||||||
|  | \item \texttt{killall} (\ref{killall}): Signal an mehrere Prozesse schicken | ||||||
|  | \item \texttt{ps} (\ref{ps}): Proze<7A>liste ausgeben | ||||||
|  | \item \texttt{pgrep} (\ref{pgrep}): Bestimmte Prozesse suchen | ||||||
|  | \item \texttt{pkill} (\ref{pkill}): Bestimmte Prozesse t<>ten | ||||||
|  | \end{itemize} | ||||||
|  |  | ||||||
|  |  | ||||||
| \section{... und H<>mmer}\label{haemmer} | \section{... und H<>mmer}\label{haemmer} | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{awk}\label{awk}\index{awk=\texttt{awk}|(textbf} | ||||||
|  |  | ||||||
| \subsection{awk} | TODO!!! awk | ||||||
|  |  | ||||||
| TODO!! | \index{awk=\texttt{awk}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{basename}\label{basename}\index{basename=\texttt{basename}|(textbf} | \subsection{basename}\label{basename}\index{basename=\texttt{basename}|(textbf} | ||||||
|  |  | ||||||
| Dem Tool \texttt{basename} wird als Parameter ein Pfad zu einer Datei | Dem Tool \texttt{basename} wird als Parameter ein Pfad zu einer Datei | ||||||
| <EFBFBD>bergeben. Der in der Angabe enthaltene Pfad wird abgeschnitten, nur der Name | <EFBFBD>bergeben. Der in der Angabe enthaltene Pfad wird abgeschnitten, nur der Name | ||||||
| der eigentlichen Datei wird zur<75>ckgegeben. | der eigentlichen Datei wird zur<75>ckgegeben. Siehe auch \texttt{dirname} | ||||||
|  | (\ref{dirname}). | ||||||
|  |  | ||||||
| \index{basename=\texttt{basename}|)} | \index{basename=\texttt{basename}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{bc} | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{bc}\label{bc}\index{bc=\texttt{bc}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! | Mit dem Kommando \texttt{bc} verf<72>gt die Shell praktisch <20>ber einen | ||||||
|  | Taschenrechner. Die Man-Page verr<72>t, da<64> es sich hierbei um ein erstaunlich | ||||||
|  | komplexes Programm handelt, in der Praxis findet man allerdings meistens | ||||||
|  | einfache Anwendungen wie das inkrementieren einer Laufvariable (\texttt{i=`bc | ||||||
|  | \$i + 1`}). | ||||||
|  |  | ||||||
|  | Bei Multiplikationen ist darauf zu achten, da<64> der Stern in der Shell eine | ||||||
|  | Sonderbedeutung hat, er mu<6D> also gequoted werden: \texttt{i=`bc \$i | ||||||
|  | \textbackslash{}* 3`}. | ||||||
|  |  | ||||||
|  | Eine andere M<>glichkeit f<>r einfache Rechnungen besteht in der sogenannten | ||||||
|  | Arithmetik-Expansion (Siehe \ref{arithmetikexpansion}). | ||||||
|  |  | ||||||
|  | \index{bc=\texttt{bc}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{cat}\label{cat}\index{cat=\texttt{cat}|(textbf} | \subsection{cat}\label{cat}\index{cat=\texttt{cat}|(textbf} | ||||||
|  |  | ||||||
| Auch \texttt{cat} ist ein oft unterbewertetes Tool. Seine Aufgabe besteht zwar | Auch \texttt{cat} ist ein oft unterbewertetes Tool. Seine Aufgabe besteht zwar | ||||||
| @@ -139,24 +203,25 @@ Au | |||||||
| Daten an ein Programm <20>bergeben, das nur von der Standardeingabe lesen kann | Daten an ein Programm <20>bergeben, das nur von der Standardeingabe lesen kann | ||||||
| (Filter). | (Filter). | ||||||
|  |  | ||||||
| \texttt{cat} verf<72>gt <20>ber eine Reige von Parametern, um die Ausgabe zu | \texttt{cat} verf<72>gt <20>ber eine Reihe von Parametern, um die Ausgabe zu | ||||||
| formatieren, so k<>nnen mit \texttt{-n} bzw. \texttt{-b} die Zeilen nummeriert | formatieren, so k<>nnen mit \texttt{-n} bzw. \texttt{-b} die Zeilen numeriert | ||||||
| werden, oder mit \texttt{-s} mehrere Zeilen zu einer einzigen zusammengefa<66>t | werden, oder mit \texttt{-s} mehrere Zeilen zu einer einzigen zusammengefa<66>t | ||||||
| werden. | werden. | ||||||
|  |  | ||||||
| \index{cat=\texttt{cat}|)} | \index{cat=\texttt{cat}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{chpasswd}\label{script}\index{chpasswd=\texttt{chpasswd}|(textbf} | \subsection{chpasswd}\label{script}\index{chpasswd=\texttt{chpasswd}|(textbf} | ||||||
|  |  | ||||||
| Mit diesem Kommando bietet sich dem Administrator des Systems die M<>glichkeit, | Mit diesem Kommando bietet sich dem Administrator des Systems die | ||||||
| scriptgesteuert die Pa<50>w<EFBFBD>rter f<>r neue Benutzer zu vergeben. Manuell <20>ndert man | M<EFBFBD>g\-lich\-keit, scriptgesteuert die Pa<50>w<EFBFBD>rter f<>r neue Benutzer zu vergeben. | ||||||
| ein Pa<50>wort mit dem Kommando \texttt{passwd}\index{passwd=\texttt{passwd}}, | Manuell <20>ndert man ein Pa<50>wort mit dem Kommando | ||||||
| allerdings l<>scht (flusht) dieses Programm die Standard-Eingabe, bevor es das | \texttt{passwd}\index{passwd=\texttt{passwd}}, allerdings l<>scht (flusht) | ||||||
| neue Pa<50>wort erwartet. Somit lassen sich Pa<50>w<EFBFBD>rter mit \texttt{passwd} nur | dieses Programm die Standard-Eingabe, bevor es das neue Pa<50>wort erwartet. Somit | ||||||
| interaktiv <20>ndern\footnote{Es gibt auch einen anderen Weg: Man kann | lassen sich Pa<50>w<EFBFBD>rter mit \texttt{passwd} nur interaktiv <20>ndern\footnote{Es | ||||||
| \texttt{passwd} auch mittels \texttt{expect} fernsteuern. Allerdings ist diese | gibt auch einen anderen Weg: Man kann \texttt{passwd} auch mittels | ||||||
| Methode weniger elegant.}. | \texttt{expect} fernsteuern. Allerdings ist diese Methode weniger elegant.}. | ||||||
|  |  | ||||||
| Das Kommando wird in der Form | Das Kommando wird in der Form | ||||||
|  |  | ||||||
| @@ -171,14 +236,48 @@ Allerdings sollte dabei aus Sicherheitsgr | |||||||
| diese Datei nicht allgemein lesbar ist. | diese Datei nicht allgemein lesbar ist. | ||||||
|  |  | ||||||
| \index{chpasswd=\texttt{chpasswd}|)} | \index{chpasswd=\texttt{chpasswd}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{cp}\label{cp}\index{cp=\texttt{cp}|(textbf} | ||||||
|  |  | ||||||
|  | Mit \texttt{cp} werden Dateien kopiert. Die wichtigsten Optionen im | ||||||
|  | Zusammenhang mit Skripten sind \texttt{-f} und \texttt{-R}. Ersteres erzwingt | ||||||
|  | (force) das Kopieren, falls an der Zielstelle schon Dateien existieren werden | ||||||
|  | sie <20>berschrieben. Letzteres erm<72>glicht ein rekursives Kopieren. | ||||||
|  | Verzeichnisse~---~auch leere~---~k<>nnen nur mit \texttt{-R} kopiert werden. | ||||||
|  |  | ||||||
|  | \index{cp=\texttt{cp}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{cut}\label{cut}\index{cut=\texttt{cut}|(textbf} | ||||||
|  |  | ||||||
|  | Wie der Name (fast) schon sagt, kann man mit diesem Kommando Zeilen | ||||||
|  | zerschneiden. Mit den Parametern \texttt{-c} (Character) oder \texttt{-f} | ||||||
|  | (Field) wird bestimmt, in welcher Einheit die Schnittstellen abgesteckt werden | ||||||
|  | sollen. Falls die Zeilen in Felder zerteilt werden sollen, kann zus<75>tzlich | ||||||
|  | mittels \texttt{-d} der Delimiter, also das Trennzeichen bestimmt werden. Wird | ||||||
|  | das nicht explizit getan, wird der Tabulator benutzt. | ||||||
|  |  | ||||||
|  | Dieser Definition folgt die Angabe des zu behaltenden Bereichs. Daf<61>r kann eins | ||||||
|  | der Formate N, N-, N-M oder -M benutzt werden. | ||||||
|  |  | ||||||
|  | \LTXtable{\textwidth}{tab_kommandos_cut_beispiele.tex} | ||||||
|  |  | ||||||
|  | \index{cut=\texttt{cut}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{dirname}\label{dirname}\index{dirname=\texttt{dirname}|(textbf} | \subsection{dirname}\label{dirname}\index{dirname=\texttt{dirname}|(textbf} | ||||||
|  |  | ||||||
| Analog zu \texttt{basename} gibt \texttt{dirname} nur die Pfad-Komponente einer | Analog zu \texttt{basename} (\ref{basename}) gibt \texttt{dirname} nur die | ||||||
| angegebenen Datei zur<75>ck. | Pfad-Komponente einer angegebenen Datei zur<75>ck. | ||||||
|  |  | ||||||
| \index{dirname=\texttt{dirname}|)} | \index{dirname=\texttt{dirname}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{echo}\label{echo}\index{echo=\texttt{echo}|(textbf} | \subsection{echo}\label{echo}\index{echo=\texttt{echo}|(textbf} | ||||||
|  |  | ||||||
| Dies ist wohl der grundlegendste Befehl, der in einem Skript verwendet werden | Dies ist wohl der grundlegendste Befehl, der in einem Skript verwendet werden | ||||||
| @@ -196,49 +295,42 @@ der Praxis oft als sehr hilfreich: | |||||||
| \index{echo=\texttt{echo}|)} | \index{echo=\texttt{echo}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{expr} | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{expr}\label{expr}\index{expr=\texttt{expr}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! expr | ||||||
|  |  | ||||||
|  | \index{expr=\texttt{expr}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{find}\label{find}\index{find=\texttt{find}|(textbf} | ||||||
|  |  | ||||||
|  | TODO!!! find | ||||||
|  |  | ||||||
|  | Siehe auch: Abschnitt \ref{beispiele_suchen_dateien}. | ||||||
|  |  | ||||||
|  | \index{find=\texttt{find}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{grep}\label{grep}\index{grep=\texttt{grep}|(textbf} | \subsection{grep}\label{grep}\index{grep=\texttt{grep}|(textbf} | ||||||
|  |  | ||||||
| Das Tool \texttt{grep} stammt aus dem Standard-Repertoire eines jeden | Das Tool \texttt{grep} stammt aus dem Standard-Repertoire eines jeden | ||||||
| Systemadministrators. Mit seiner Hilfe kann in einer oder mehreren Dateien, | Sys\-tem\-ad\-mi\-ni\-stra\-tors. Mit seiner Hilfe kann in einer oder mehreren Dateien, | ||||||
| oder eben auch in einem Datenstrom nach dem Auftreten bestimmter regul<75>rer | oder eben auch in einem Datenstrom nach dem Auftreten bestimmter regul<75>rer | ||||||
| Ausdr<EFBFBD>cke (siehe \ref{mustererkennung}) gesucht werden. | Ausdr<EFBFBD>cke (siehe \ref{mustererkennung}) gesucht werden. | ||||||
|  |  | ||||||
| TODO!!! |  | ||||||
|  |  | ||||||
| Die folgende Tabelle stellt einige der vielen Parameter vor: | Die folgende Tabelle stellt einige der vielen Parameter vor: | ||||||
|  |  | ||||||
| \LTXtable{\textwidth}{tab_kommandos_grep_parameter.tex} | \LTXtable{\textwidth}{tab_kommandos_grep_parameter.tex} | ||||||
|  |  | ||||||
| Im Zusammenhang mit grep st<73><74>t fast jeder Shell-Skripter fr<66>her oder sp<73>ter auf | Siehe auch: Abschnitt \ref{beispiele_suchen}. | ||||||
| das Problem, da<64> er irgendwas davon abh<62>ngig machen will, ob ein bestimmter |  | ||||||
| Proze<EFBFBD> l<>uft oder nicht. Im Normalfall wird er zuerst folgendes ausprobieren, |  | ||||||
| was aber oft (nicht immer) in die Hose gehen wird: |  | ||||||
|  |  | ||||||
| \texttt{ps aux | grep }\textit{prozessname}\texttt{ \&\& echo \dq}\textit{l<EFBFBD>uft |  | ||||||
| schon}\texttt{\dq} |  | ||||||
|  |  | ||||||
| Der Grund daf<61>r ist, da<64> unter Umst<73>nden in der Ausgabe von \texttt{ps} auch |  | ||||||
| das \texttt{grep}-Kommando samt Parameter (\textit{prozessname}) aufgelistet |  | ||||||
| wird. So findet das \texttt{grep}-Kommando sich quasi selbst. |  | ||||||
|  |  | ||||||
| Abhilfe schafft das folgende Konstrukt: |  | ||||||
|  |  | ||||||
| \texttt{ps aux | grep \dq}\textit{[p]rozessname}\texttt{\dq~\&\& echo |  | ||||||
| \dq}\textit{l<EFBFBD>uft schon}\texttt{\dq} |  | ||||||
|  |  | ||||||
| Das p ist jetzt als eine Zeichenmenge (regul<75>rer Ausdruck) angegeben worden. |  | ||||||
| Jetzt sucht \texttt{grep} also nach dem String \textit{prozessname}, in der |  | ||||||
| Ausgabe von \texttt{ps} erscheint das \texttt{grep}-Kommando allerdings mit |  | ||||||
| \textit{[p]rozessname} und wird somit ignoriert. |  | ||||||
|  |  | ||||||
| \index{grep=\texttt{grep}|)} | \index{grep=\texttt{grep}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{head}\label{head}\index{head=\texttt{head}|(textbf} | \subsection{head}\label{head}\index{head=\texttt{head}|(textbf} | ||||||
|  |  | ||||||
| \texttt{head} ist das Gegenst<73>ck zu \texttt{tail} (Siehe \ref{tail}). Hier | \texttt{head} ist das Gegenst<73>ck zu \texttt{tail} (Siehe \ref{tail}). Hier | ||||||
| @@ -247,16 +339,71 @@ werden allerdings nicht die letzten Zeilen angezeigt, sondern die ersten. | |||||||
| \index{head=\texttt{head}|)} | \index{head=\texttt{head}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{kill} | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{kill}\label{kill}\index{kill=\texttt{kill}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! kill | ||||||
|  |  | ||||||
|  | <EFBFBD>brigens: Die landl<64>ufige Annahme ist, da<64> man mit dem | ||||||
|  | \texttt{kill}-Kom\-man\-do Prozesse `umbringt'. Das ist zwar wahr, aber nicht | ||||||
|  | die ganze Wahrheit. | ||||||
|  |  | ||||||
|  | \index{kill=\texttt{kill}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{printf} | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{killall}\label{killall}\index{killall=\texttt{killall}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! killall | ||||||
|  |  | ||||||
|  | \index{killall=\texttt{killall}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{mv}\label{mv}\index{mv=\texttt{mv}|(textbf} | ||||||
|  |  | ||||||
|  | TODO!!! mv | ||||||
|  |  | ||||||
|  | \index{mv=\texttt{mv}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{pgrep}\label{pgrep}\index{pgrep=\texttt{pgrep}|(textbf} | ||||||
|  |  | ||||||
|  | TODO!!! pgrep | ||||||
|  |  | ||||||
|  | Siehe auch: Abschnitt \ref{beispiele_suchen_prozesse}. | ||||||
|  |  | ||||||
|  | \index{pgrep=\texttt{pgrep}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{pkill}\label{pkill}\index{pkill=\texttt{pkill}|(textbf} | ||||||
|  |  | ||||||
|  | TODO!!! pkill | ||||||
|  |  | ||||||
|  | \index{pkill=\texttt{pkill}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{printf}\label{printf}\index{printf=\texttt{printf}|(textbf} | ||||||
|  |  | ||||||
|  | TODO!!! printf | ||||||
|  |  | ||||||
|  | \index{printf=\texttt{printf}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{ps}\label{ps}\index{ps=\texttt{ps}|(textbf} | ||||||
|  |  | ||||||
|  | TODO!!! ps | ||||||
|  |  | ||||||
|  | Siehe auch: Abschnitt \ref{beispiele_suchen_prozesse}. | ||||||
|  |  | ||||||
|  | \index{ps=\texttt{ps}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{read}\label{read}\index{read=\texttt{read}|(textbf} | \subsection{read}\label{read}\index{read=\texttt{read}|(textbf} | ||||||
|  |  | ||||||
| Mit dem Kommando \texttt{read} kann man Eingaben von der | Mit dem Kommando \texttt{read} kann man Eingaben von der | ||||||
| @@ -280,7 +427,9 @@ Leerzeichen in die Variable \texttt{var} ein. | |||||||
|  |  | ||||||
| Wenn nur eine bestimmte Zahl von Zeichen gelesen werden soll, kann diese durch | Wenn nur eine bestimmte Zahl von Zeichen gelesen werden soll, kann diese durch | ||||||
| den Parameter \texttt{-n} angegeben werden. Der Befehl \texttt{read -n 5 var} | den Parameter \texttt{-n} angegeben werden. Der Befehl \texttt{read -n 5 var} | ||||||
| liest die ersten f<>nf Zeichen in die Variable \texttt{var} ein. | liest die ersten f<>nf Zeichen in die Variable \texttt{var} ein. Demzufolge kann | ||||||
|  | ein Skript durch ein \texttt{read -n 1} dazu gebracht werden, auf einen | ||||||
|  | einzelnen Tastendruck~---~nicht zwingend ein Return~---~zu warten. | ||||||
|  |  | ||||||
| Mit dem Parameter \texttt{-p} kann man einen Prompt, also eine | Mit dem Parameter \texttt{-p} kann man einen Prompt, also eine | ||||||
| Eingabeaufforderung ausgeben lassen. \texttt{read -p \dq{}Gib was ein:\dq~var} | Eingabeaufforderung ausgeben lassen. \texttt{read -p \dq{}Gib was ein:\dq~var} | ||||||
| @@ -308,6 +457,15 @@ Timeout oder ein EOF auf. | |||||||
| \index{read=\texttt{read}|)} | \index{read=\texttt{read}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{rm}\label{rm}\index{rm=\texttt{rm}|(textbf} | ||||||
|  |  | ||||||
|  | TODO!!! rm | ||||||
|  |  | ||||||
|  | \index{rm=\texttt{rm}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{script}\label{script}\index{script=\texttt{script}|(textbf} | \subsection{script}\label{script}\index{script=\texttt{script}|(textbf} | ||||||
|  |  | ||||||
| Dieses Kommando eignet sich vorz<72>glich f<>r das Debuggen fertiger Skripte. Man | Dieses Kommando eignet sich vorz<72>glich f<>r das Debuggen fertiger Skripte. Man | ||||||
| @@ -323,32 +481,45 @@ debuggen, da sowohl Ein- als auch Ausgaben in dem Logfile sichtbar sind. | |||||||
| \index{script=\texttt{script}|)} | \index{script=\texttt{script}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{sed} | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{sed}\label{sed}\index{sed=\texttt{sed}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! sed | ||||||
|  |  | ||||||
|  | \index{sed=\texttt{sed}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{seq} | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{seq}\label{seq}\index{seq=\texttt{seq}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! seq | ||||||
|  |  | ||||||
|  | \index{seq=\texttt{seq}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{sleep} | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{sleep}\label{sleep}\index{sleep=\texttt{sleep}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! sleep | ||||||
|  |  | ||||||
|  | \index{sleep=\texttt{sleep}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{sort} | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{sort}\label{sort}\index{sort=\texttt{sort}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! sort | ||||||
|  |  | ||||||
|  | \index{sort=\texttt{sort}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{tail}\label{tail}\index{tail=\texttt{tail}|(textbf} | \subsection{tail}\label{tail}\index{tail=\texttt{tail}|(textbf} | ||||||
|  |  | ||||||
| Der Befehl \texttt{tail} gibt die letzten zehn Zeilen einer Datei aus. Wenn | Der Befehl \texttt{tail} gibt die letzten zehn Zeilen einer Datei aus. Wenn | ||||||
| kein Dateiname (oder ein \texttt{-}) angegeben wird, liest \texttt{tail} von | kein Dateiname (oder ein \texttt{-}) angegeben wird, liest \texttt{tail} von | ||||||
| der Standard-Eingabe. Man kann die Anzahl der ausgegebenen Zeilen mit dem | der Standard-Eingabe. Man kann die Anzahl der ausgegebenen Zeilen mit dem | ||||||
| Parameter \texttt{-l} steuern. | Parameter \texttt{-n} steuern. | ||||||
|  |  | ||||||
| Mit dem Parameter \texttt{-f} (follow) gibt \texttt{tail} neue Zeilen aus, | Mit dem Parameter \texttt{-f} (follow) gibt \texttt{tail} neue Zeilen aus, | ||||||
| sobald sie an die Datei angeh<65>ngt werden. | sobald sie an die Datei angeh<65>ngt werden. | ||||||
| @@ -356,11 +527,15 @@ sobald sie an die Datei angeh | |||||||
| \index{tail=\texttt{tail}|)} | \index{tail=\texttt{tail}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{tee} | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{tee}\label{tee}\index{tee=\texttt{tee}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! tee | ||||||
|  |  | ||||||
|  | \index{tee=\texttt{tee}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
| \subsection{touch}\label{touch}\index{touch=\texttt{touch}|(textbf} | \subsection{touch}\label{touch}\index{touch=\texttt{touch}|(textbf} | ||||||
|  |  | ||||||
| Mit diesem Kommando kann man einerseits Dateien anlegen wenn sie nicht | Mit diesem Kommando kann man einerseits Dateien anlegen wenn sie nicht | ||||||
| @@ -380,11 +555,25 @@ Referenzdatei angepa | |||||||
| \index{touch=\texttt{touch}|)} | \index{touch=\texttt{touch}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{wc} | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{wc}\label{wc}\index{wc=\texttt{wc}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! wc | ||||||
|  |  | ||||||
|  | \index{wc=\texttt{wc}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \subsection{who} | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{who}\label{who}\index{who=\texttt{who}|(textbf} | ||||||
|  |  | ||||||
| TODO!!! | TODO!!! who | ||||||
|  |  | ||||||
|  | \index{who=\texttt{who}|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||||
|  | \subsection{xargs}\label{xargs}\index{xargs=\texttt{xargs}|(textbf} | ||||||
|  |  | ||||||
|  | TODO!!! xargs | ||||||
|  |  | ||||||
|  | \index{xargs=\texttt{xargs}|)} | ||||||
|   | |||||||
| @@ -247,6 +247,23 @@ erzeugen. | |||||||
| \index{Klammer-Expansion|)} | \index{Klammer-Expansion|)} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | \section{Arithmetik-Expansion\label{arithmetikexpansion}\index{Arithmetik-Expansion|(textbf}} | ||||||
|  |  | ||||||
|  | Auch hier werden Klammern expandiert. Allerdings gleich doppelte Klammern. Mit | ||||||
|  | einem Konstrukt in der Form \texttt{i=\$((\$i + 1))} k<>nnen einfache | ||||||
|  | Berechnungen angestellt werden. | ||||||
|  |  | ||||||
|  | Dabei wird der Ausdruck in den Klammern bewertet als ob er in doppelten | ||||||
|  | Anf<EFBFBD>hrungszeichen stehen w<>rde. Das bedeutet zum Einen, da<64> man auch mit | ||||||
|  | Variablen rechnen kann, zum anderen macht es das Quoten des Sternchens | ||||||
|  | <EFBFBD>berfl<EFBFBD>ssig. | ||||||
|  |  | ||||||
|  | F<EFBFBD>r komplexere Berechnungen steht das Tool \texttt{bc} (Siehe Abschnitt | ||||||
|  | \ref{bc}) zur Verf<72>gung. | ||||||
|  |  | ||||||
|  | \index{Arithmetik-Expansion|)} | ||||||
|  |  | ||||||
|  |  | ||||||
| \section{Programmablaufkontrolle} | \section{Programmablaufkontrolle} | ||||||
|  |  | ||||||
| Bei der Shell-Programmierung verf<72>gt man <20>ber <20>hnliche Konstrukte wie bei anderen Programmiersprachen, um den Ablauf des Programms zu steuern. Dazu geh<65>ren Funktionsaufrufe, Schleifen, Fallunterscheidungen und dergleichen.\nopagebreak | Bei der Shell-Programmierung verf<72>gt man <20>ber <20>hnliche Konstrukte wie bei anderen Programmiersprachen, um den Ablauf des Programms zu steuern. Dazu geh<65>ren Funktionsaufrufe, Schleifen, Fallunterscheidungen und dergleichen.\nopagebreak | ||||||
| @@ -401,8 +418,8 @@ In anderen Sprachen kann man mit der | |||||||
| Laufvariable\index{Laufvariable} <20>ber einen bestimmten Wertebereich iterieren | Laufvariable\index{Laufvariable} <20>ber einen bestimmten Wertebereich iterieren | ||||||
| lassen (\texttt{for i = 1 to 100...next}). Da das mit der \texttt{for}-Schleife | lassen (\texttt{for i = 1 to 100...next}). Da das mit der \texttt{for}-Schleife | ||||||
| der Shell nicht geht\footnote{Auf einigen Systemen steht f<>r diesen Zweck auch | der Shell nicht geht\footnote{Auf einigen Systemen steht f<>r diesen Zweck auch | ||||||
| das Kommando \texttt{seq}\index{seq=\texttt{seq}} zur Verf<72>gung.}, | das Kommando \texttt{seq} (Siehe Abschnitt \ref{seq}) zur Verf<72>gung.}, ersetzt | ||||||
| ersetzt man die Funktion durch geschickte Anwendung der | man die Funktion durch geschickte Anwendung der | ||||||
| \texttt{while}-Schleife:\nopagebreak | \texttt{while}-Schleife:\nopagebreak | ||||||
|  |  | ||||||
| \LTXtable{\textwidth}{tab_beisp_while_for.tex} | \LTXtable{\textwidth}{tab_beisp_while_for.tex} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user