\input{confighandout} \subsection{Shell-Programmierung} \subsubsection{Aufbau von Shell-Skripten} \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} \subsubsection{Variablen und Parameter} \begin{lstlisting} #!/bin/sh MY_VAR=17 PAR_1=$1 datum=`date` MY_HOST=$(hostname) 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. \subsubsection{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} \subsubsection{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} \subsubsection{Funktionen} \begin{lstlisting} #!/bin/sh error_log() { echo "Fehler: $1" >> my_log_file } ... error_log "Datei nicht gefunden." \end{lstlisting} \subsubsection{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} \subsubsection{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} \input{tailhandout}