diff options
Diffstat (limited to 'linux-basics/sh-programming')
| -rw-r--r-- | linux-basics/sh-programming/handout_sh-programming_de.tex | 190 |
1 files changed, 188 insertions, 2 deletions
diff --git a/linux-basics/sh-programming/handout_sh-programming_de.tex b/linux-basics/sh-programming/handout_sh-programming_de.tex index 5590e6e..f27f70e 100644 --- a/linux-basics/sh-programming/handout_sh-programming_de.tex +++ b/linux-basics/sh-programming/handout_sh-programming_de.tex @@ -10,17 +10,203 @@ \subsection*{Aufbau von Shell-Skripten} -Text +\begin{itemize} +\item Syntax: \cmd{\#!/ein/interpreter} +\item Beliebiges Programm als Interpreter möglich +\item Beispiele hier: \cmd{\#!/bin/sh} +\item Danach beliebige Shell-Befehle möglich +\end{itemize} + +Das übliche \cmd{Hello World} sieht als Shell-Skript etwa so aus: + +\begin{lstlisting} +#!/bin/sh +echo Hello World +\end{lstlisting} \subsection*{Variablen und Parameter} -Text +\begin{lstlisting} +#!/bin/sh + +MY_VAR=17 +PAR_1=$1 +datum=`date` + +echo variable is $(MYVAR), parameter is $(PAR_1) +\end{lstlisting} + +Variablen können einfach in der Form \cmd{Name=Wert} geschrieben werden. Sie +haben in Shell-Skripten keinen Typ und werden bei der ersten Verwendung +automatisch angelegt. + +\subsection*{Ausgabe-Umleitung} + +\begin{lstlisting} +#!/bin/sh + +# How many lines in addr.txt contain "Jones" ? +# Store the result in "jones_count" +grep Jones addr.txt | wc -l > jones_count + +# Append a message to a log file +echo "My message" >> log_file + +exit 0 +\end{lstlisting} + \subsection*{Bedingte Verzweigungen} +Allgemeine Form: + +\begin{lstlisting} +#!/bin/sh + +if [ bedingung ] + then + ... + else + ... +fi + +# in one line: + +if [ bedingung ] ; then ... ; fi +\end{lstlisting} + +Zahlentests: + +\begin{lstlisting} +#!/bin/sh + +# Zahlentests: -eq -ne -lt -gt -le -ge +zahl=15 +if [ $zahl -lt 20 ] ; then ... + +# String-Tests: = != < > -n -z +string="Hallo" +if [ $string != "hello" ] ; then ... +\end{lstlisting} + +Dateitests: + +\begin{lstlisting} +#!/bin/sh +# Dateitests, z.B. if [ -f $datei ] ; then ... +# Auswahl: +# -f ist eine normale Datei +# -d ist ein Verzeichnis +# -e existiert +# -s existiert und ist nicht leer +# -r ist lesbar +# -w ist schreibbar +# -x ist ausfuehrbar +# -b ist ein Block Device +# -c ist ein Character Device +\end{lstlisting} + +Test des Rückgabewerts von Programmen: + +\begin{lstlisting} +#!/bin/sh + +# Does addr.txt contain "Jones" ? +if grep Jones addr.txt ; then ... + +# Return value 0 means OK +exit 0 + +\end{lstlisting} + +Short circuit tests: + +\begin{lstlisting} +#!/bin/sh + +# Short circuit tests: + +make && make install + +grep Jones addr.txt || echo "No Jones found!" +\end{lstlisting} + \subsection*{Schleifen} + +For-Schleife: + +\begin{lstlisting} +#!/bin/sh + +for datei in datei1 datei2 datei3 +do + cp $datei $datei.bak +done + +for datei in * +do + ... +done +\end{lstlisting} + +While-Schleife: + +\begin{lstlisting} +#!/bin/sh + +while [ bedingung ] +do + ... +done + +while [ bedingung ] ; do ... ; done + +# bedingung wie bei if +\end{lstlisting} + +\subsection*{Funktionen} + +\begin{lstlisting} +#!/bin/sh + +error_log() { + echo "Fehler: $1" >> my_log_file +} + +... + +error_log "Datei nicht gefunden." +\end{lstlisting} + \subsection*{Einbinden anderer Skripte} + +\begin{lstlisting} +#!/bin/sh + +# Include an external script: +. my_other_script + +# run another script/command in the background: +my_other_script& + +\end{lstlisting} + \subsection*{Zugriff auf Dateien} +\begin{lstlisting} +#!/bin/sh + +ls -1 > dateiliste.txt + +while read dateiname +do + if [ -d $dateiname ] + then + echo "$dateiname ist ein Verzeichnis" + fi +done < dateiliste.txt + +\end{lstlisting} + \end{document} |
