From afd08dc5de43af71d11f41c3d9d84a695d15efd5 Mon Sep 17 00:00:00 2001
From: "Hans J. Koch" <hjk@linutronix.de>
Date: Sun, 21 Jun 2009 17:05:15 +0200
Subject: Update handout sh-programming

---
 .../sh-programming/handout_sh-programming_de.tex   | 190 ++++++++++++++++++++-
 1 file changed, 188 insertions(+), 2 deletions(-)

(limited to 'linux-basics/sh-programming/handout_sh-programming_de.tex')

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}
-- 
cgit v1.2.3

