+++ /dev/null
-\documentclass[xcolor,graphicx,parskip]{beamer}
-
-\usepackage[ngerman]{babel}
-\usepackage[utf8]{inputenc}
-%\usepackage{graphicx}
-\usepackage{tipa}
-
-\usetheme{Marburg}
-\usecolortheme{albatross}
-
-\setbeamertemplate{navigation symbols}{}
-\setbeamertemplate{footer}{\insertslidenumber}
-\setbeamertemplate{itemize items}[triangle]
-
-\setbeamertemplate{page number in head/foot}[totalframenumber]
-
-\begin{document}
-
-\setbeamercolor{author}{fg=black}
-\setbeamercolor{institute}{fg=green}
-\setbeamercolor{date}{fg=black}
-\setbeamercolor{title}{fg=black}
-\setbeamercolor{subtitle}{fg=blue}
-
-\title[My Way to (S)HELL]{MY Way to (S)HELL}
-\subtitle{Einführung in die Programmierung mit bash}
-
-\author{Bücherratten}
-\institute{BeLUG}
-\date{05.02.2020}
-
-{
-\usebackgroundtemplate{\includegraphics[height=\paperheight]{/home/ratten/igitt/doku/Vortrag/bash-Vortrag/bash-on-fire.png}}
-
-\begin{frame}
-\maketitle
-\end{frame}
-
-\title{A Way to HELL}
-\subtitle{Einführung in die Programmierung mit bash}
-
-\author{Bücherratten}
-\institute{BeLUG}
-\date{05.02.2020}
-
-\begin{frame}
-\maketitle
-\end{frame}
-}
-
-\section{WhoAmI}
-\begin{frame}
- \frametitle{WhoAmI}
- \begin{itemize}
- \item{35 Jahre}
- \item{Linux Fan}
- \begin{itemize}
- \item{FSFE e.V}
- \item{BeLUG e.V.}
- \item{LinuxWorks!}
- \end{itemize}
- \item{Auszubildene Fachinformatikerin Bereich Systemintegration \\(1. Lehrjahr) im ITDZ Berlin}
- \item{Hobby: Textadventure bash}
- \item{Butterbrotdosen Smartphone}
- \end{itemize}
-\end{frame}
-
-\section{RTFM}
-\begin{frame}[shrink]
- \frametitle{lese das Handbuch}
- \framesubtitle{rtfm}
- \smallbreak
- \Huge{man man
- \newline
- \pause
- \smallbreak
- man bash
- \newline
- \pause
- \smallbreak
- info bash
- \newline
- \pause
- \smallbreak
- apropos}
- \newline
- \pause
- \normalsize
- \smallbreak
- \textcolor{red}{Disklaimer: Dieser Vortrag hat keinen Anspruch auf Vollständigkeit! Sondern Spaß!}
-
-\end{frame}
-
-\section{Liste}
-
-\begin{frame}
- \frametitle{Einkaufsliste}
- \framesubtitle{Was wird gebraucht?}
-
- \begin{itemize}
- \item{aktuelles Linux}
- \item{Terminal}
- \pause
- \item{Packages}
- \begin{itemize}
- \item{sl}
- \item{ascii-quarium (komplizierter, weil kein fertiges Package für Debian-basierende Systeme)}
- \item{cowsay}
- \item{ponysay (auch als Debian-Paket verfügbar, aber noch nicht in den offiziellen Repros)}
- \item{figlet}
- \item{lolcat}
- \item{which}
- \item{expr}
- \item{curl}
- \item{date}
- \item{ssh}
- \item{cmatrix}
- \item{script}
- \item{fortune}
- \end{itemize}
- \end{itemize}
-\end{frame}
-
-\section{Bash-Exkurse}
-\begin{frame}[shrink]
- \frametitle{bash}
- \framesubtitle{Unser Werkzeugkasten}
- \large{kleiner Exkurs zur Bash}
- \normalsize{
- \begin{itemize}
- \item{erster Release war 1989}
- \item{name ist ein Akkronym für Bourne-Again Shell}
- \item{ist der Ersatz für die Bourne Shell}
- \item{Steht unter GPLv3 (bei macOS wurde deswegen auf zsh umgestellt)}
- \pause
- \item{es ist nicht die einzige Shell unter Unix-Systemen (es gibt sehr viel mehr), aber Default}
- \item{Die Shell ist eine der Schnittstelle zwischen Benutzer und Betriebssystem}
- \pause
- \item{es gibt ziemlich viel Unterstützung für die einzelnen Befehle}
- \item{sehr mächtig, (kann fast alles, bis auf kaffee kochen)}
- \item{Erreichbarkeit: mit dem Shortcut: ALT STRG F1 oder ihr nutzt das pseudo-terminal eurer Wahl}
- \pause
- \item{was wir nicht machen können - aus Zeitlichen Gründen}
- \begin{itemize}
- \item{mit Farben spielen}
- \item{RegularExpression}
- \item{SubShells in der SubShell}
- \end{itemize}
- \end{itemize}}
-\end{frame}
-
-\section{step by step}
-
-\begin{frame}
- \frametitle{Wer brauch schon Erklärungen im Code?}
- \framesubtitle{Kommentare}
-
- \#Niemand hat die Absicht, Hash-Tags als Kommentar zu benutzen \\
- \pause
- \#Für Kommentare wird der ganze Latten-Zaun benutzt \\
- \pause
- \#Die Kommentare waren zu erst da!
-\end{frame}
-
-\section{Pipe}
-\begin{frame}[fragile]
- \frametitle{Auf der Leitung stehen}
- \framesubtitle{Was ist eine Pipe?}
- \begin{itemize}
- \item{Die Ausgabe eines Befehls an einen anderen weiter geben}
- \pause
- \item{\Huge{\textpipe}}
- \end{itemize}
- \pause
-\begin{verbatim}
- fortune | cowsay | lolcat
-\end{verbatim}
-\pause
-Das geht beliebig oft
-\end{frame}
-
-\section{Kisten packen}
-
-\begin{frame}[fragile]
- \frametitle{Das Kurz-Zeit-Gedächnis}
- \framesubtitle{Kisten, für alles und nicht's}
- \large{Was sind Variablen?}
- \normalsize{
- \begin{itemize}
- \item{denk dir ein Wort oder Buchstaben aus, der kein Shell-Befehl ist}
- \pause
- \item{weise diesem Wort oder Buchstaben etwas zu}
- \item{Wichtig dabei keine Leerzeichen um das Gleichheitszeichen!}
- \pause
- \item{Es muss kein Datentyp deklariert werden}
- \end{itemize}
- \pause
-\begin{verbatim}
- var=10
- Name=HeyDu
- cmd=$(figlet -tf block Immer diese Menschen)
-\end{verbatim}
- \pause
- Das ganze wird mit
-\begin{verbatim}
- $Variabelnname
-\end{verbatim}
- benutzt.}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Das Kurz-Zeit-Gedächnis}
- \framesubtitle{Kisten, für alles und nicht's}
-
- \large{Was sind Arrays?}\\
- \normalsize{
- eine Box für mehrere Werte, mit indexiertem Inhaltsverzeichnis
- \pause
-\begin{verbatim}
- declare -a wort
- wort=(hier steht irgendwas drin)
- echo $wort
- #mit index
- echo ${wort[2]}
- #gesamtes Array
- echo ${wort[*]}
- echo ${wort[@]}
-\end{verbatim}
- \pause
- \small{
- hint: Der Unterschied zwischen * und @ ist das newline beim @ (wird beim looping fliegen relevant)
- }
- }
-\end{frame}
-
-\section{Zwischen-Prüfung}
-
-\begin{frame}[fragile]
- \frametitle{Das Leben besteht aus Prüfungen}
- \framesubtitle{diese verdammt Logik und ihre Tests}
- \large{Wofür macht man Tests?}
- \pause
- \normalsize{
- \begin{itemize}
- \item{ich will wissen, ob etwas richtig ist}
- \item{ich will abhänig vom Wert einer Variable etwas tun}
- \item{ich will etwas nicht tun wenn...}
- \end{itemize}
- \pause
-\begin{verbatim}
- var=11
- test $var == "10"
- echo $?
-\end{verbatim}
- \pause
- \begin{description}
- \item[var=11] setz die Variable var auf 11
- \item[test \$var == ''10''] prüf mal ob in der Variable 10 steht
- \item[echo \$?] was ist das ergebnis des letzten Befehls?
- \item[\lbrack \rbrack] so kann der test-Befehl auch geschreiben werden
- \end{description}
- }
-\end{frame}
-
-\section{Logisch}
-
-\begin{frame}[fragile]
- \frametitle{Das Leben besteht aus Prüfungen}
- \framesubtitle{diese verdammt Logik und ihre Tests}
- \large{Logik}
- \pause
- \normalsize{
- \begin{description}
- \item[UND] Prüfen, ob alles Tests wahr sind
-\begin{verbatim}
- i="Du"
- j="Hallo"
- test $i == "Du" && \
- test $j == "Hallo"
- echo $?
-\end{verbatim}
- \pause
- \item[ODER] Prüfen, ob ein Test von mehreren wahr ist
-\begin{verbatim}
- i="Name"
- j="Hallo"
- test $i == "1x" ||\
- test $j == "Hallo"
- echo $?
-\end{verbatim}
- \pause
- \item[nicht] Prüfen, ob ein Test falsch ist
-\begin{verbatim}
- i="Falsch ist falsch"
- test $i != "richtig"
- echo $?
-\end{verbatim}
- \end{description}
- \pause
- Das ganz kann belibig verknüpft werden - Also viel Spaß
- }
-\end{frame}
-
-\section{Wenn...}
-\begin{frame}[fragile]
- \frametitle{Wenn Du nicht sofort tust was ich sage, Dann ...}
- \framesubtitle{Verzweigungen}
- \large{if}\\
- \normalsize{
- Wenn, prüfe ob das wahr ist, dann...
- \pause
-\begin{verbatim}
- if test $var == "10"; then figlet "Das\
- ist wahr"; fi
-
- if [[ $var == "10" ]] ; then echo "Das\
- ist echt wahr"; figlet "knapp vorbei \
- ist auch daneben";fi
-\end{verbatim}
- \pause
- \begin{description}
- \item[= vs ==] ist egal, solange darum leerzeichen verwendet werden
- \pause
- \item[else] muss nicht unbedingt verwendet werden
- \pause
- \item[mehrfach] verschachtelungen gehen auch
- \end{description}
- \large ifelse [[Bedingung]]
- }
-\end{frame}
-
-\section{Wenn...}
-
-\begin{frame}[fragile]
- \frametitle{Wenn Du nicht sofort tust was ich sage, Dann ...}
- \framesubtitle{Verzweigungen}
- Wenn die Verschachtelungen unübersichtlich werden:
-\begin{verbatim}
- case $var in
- 10)
- cowsay -f tux "ich hab 10 gefunden"
- ;;
- 11)
- cowsay -f tutle "ich hab 11 gefunden"
- ;;
- *)
- cowsay -f ghostbusters "ich hab irgendwas\
- gefunden"
- ;;
- esac
-\end{verbatim}
-\end{frame}
-
-\section{Rechenmeister}
-
-\begin{frame}[fragile]
- \frametitle{Mathe und bash}
- \framesubtitle{Rechnen in der Shell}
- einfach auf der shell loslegen ist zu einfach
- \pause
-\begin{verbatim}
-x=$(expr $var * $var)
-\end{verbatim}
-Weise der Variable x das Ergebnis der Berechnung aus var mal var zu.
-\end{frame}
-
-\section{Test}
-
-\begin{frame}
- \frametitle{die Prüfung beginnt}
- \framesubtitle{das erste Script}
- ...and action in a shell
- \pause
- \begin{description}
- \item[cut] zerschneide etwas (-d) am Zeichen (-f) speichere Feld
- \item[echo] gib etwas aus (-e) erkenne Escape-Sequenzen
- \item[date] gib das Datum aus (+\%) Format
- \item[curl] zum holen der Webseite
- \item[grep] etwas suchen (dieses etwas wird oft als Regular Expression beschreiben)
- \end{description}
-\end{frame}
-
-
-\section{Loopings}
-
-\begin{frame}[fragile]
- \frametitle{Schleifen binden und durch loopings fliegen}
- \framesubtitle{while}
-
- \large{solage etwas stimmt}\\
- \normalsize{
- mach etwas
-
-\begin{verbatim}
- while [[ $var -eq "10" ]]
- do
- fortune
- done
-\end{verbatim}
- }
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Schleifen binden und durch loopings fliegen}
- \framesubtitle{until}
-
- \large{bis etwas stimmt}\\
- \normalsize{
- die Bedingung wird erst nach der ersten Runde in der Schliefe geprüft\\
- mach etwas
-\begin{verbatim}
- i=0
-
- until [[ $i -eq 10 ]]
- do
- ((i++))
- which brain?
- done
-\end{verbatim}
-}
-\end{frame}
-
-
-\begin{frame}[fragile]
- \frametitle{Schleifen binden und durch loopings fliegen}
- \framesubtitle{for}
-
- \large{bis etwas die Zahl \$n erreicht hat} \\
- \normalsize{
- mach etwas\\
- wird häufig für Arrays benutzt\\
- \pause
- dafür sind Inkrement (hoch zählen um 1) ((i++))\\
- und Dekrement (runter zählen um 1) ((i- -))\\
- hilfreich.
- \pause
-\begin{verbatim}
- declare -a blubb
-
- j=0
- blubb=(aber nun reicht es mir)
-
- for $i in ${blubb[@]}
- do
- ((j++))
- echo $i $j
- done
-\end{verbatim}
- }
-\end{frame}
-
-\section{Wenn Programmierer diskutieren}
-\begin{frame}[fragile,shrink]
- \frametitle{f(x)}
- \framesubtitle{Funktionen}
- \large{Teile und Herscher}
- \newline
- \normalsize{mit Funktionen können Code-Wiederholungen vermieden werden.\\
- Aber auch der übersichtlichere Strukturen geschaffen werden die leichter lesbar sind.}
- \pause
- \scriptsize{
-\begin{verbatim}
-#/bin/bash
-datumsfrage()
-{
- read -p "Welches Datum haben wir?" datVari
- if [[ $datVari -eq date ]]
- then
- figlet "stimmt"
- else
- echo "nee, stimmt nicht - nochmal"
- datumsfrage()
- fi
-}
-
-echo "ich frag mal nach dem Datum"
-datumsfrage()
-\end{verbatim}
- }
-\end{frame}
-
-
-\section{Oster-Spaß}
-\begin{frame}
- \frametitle{die zweite Prüfung}
- \framesubtitle{noch ein Script}
- ...and action in a shell\\
- \pause
- \begin{description}
- \item[sleep] bitte mal für \$n Sekunden einschlafen
- \item[read] frag mal den User (-p) die Frage (Variabelnname) (-e) mit bash-complition
- \item[RANDOM] für die Zufallsberechnung (\%) bis
- \item[exit] breche hier mal und gib mir meine Shell zurück
- \item[wc] zähl mal die wörter
- \item[scriptreplay] spiel ein aufgenommens script ab
- \end{description}
-\end{frame}
-
-
-\section{Rezepte erstellen}
-\begin{frame}[fragile]
- \frametitle{Schreibe ein Rezept}
- \framesubtitle{Not to Do}
-
- \large{Befehle zusammenpacken}
-\normalsize{
- \pause
- \begin{itemize}
- \item{Nimm den deinen lieblings-Texteditor}
- \pause
- \item{schreib deine Befehle in der Reihenfolge auf, in der sie ausgeführt werden sollen}
- \pause
- \item{Einrückungen von Code-Zeilen und das benutzen von Funktionen, erleichtern dir das zurecht finden im Code}
- \pause
- \item{speichere dein Werk unter einem Namen (auch ohne Datei-extention unter Linux ausführen)}
- \pause
- \item{teste so lange, bis es funktioniert (set +x oder -x)}
- \pause
- \item{ausführen und Spaß haben, automatisierte ausführung über cron, acron oder systemd-timer}
- \end{itemize}
-
- \pause
-\begin{verbatim}
-./name #sourcen ! es müssen Aufführrechte
- #gesetzt sein
-bash name #bash führ das mal aus
-\end{verbatim}
-}
-\end{frame}
-
-
-\begin{frame}[fragile]
- \frametitle{bang!bang!bang!}
- \framesubtitle{Was macht das shebang?}
- \large{Verrate der Shell welche Sprache du sprichst}
- \newline
- \normalsize{
- \pause
- \begin{itemize}
- \item{Das shebang ist wichtig, wenn Irrtümer vermieden werden sollen}
- \item{Das Script nicht unbedingt mit der Scriptsprache vorne weg gestartet wird}
- \end{itemize}
- \pause
- Wie sieht das aus?
-\begin{verbatim}
-#!/bin/bash
-\end{verbatim}
-Vorsicht! kann je nach Linux anders aussehen.
- }
-\end{frame}
-
-\section{The End of Talk}
-
-\begin{frame}
- \frametitle{Tipps und Tricks}
- \begin{description}
- \item[script] zeichnet auf, was in der shell passiert (inklusive der Typos)
- \item[scriptreplay] spielt wieder ab, was ihr auf gezeichnet habt, wenn ihr vorher eine timing-datei angelegt habt, dann in Echtzeit
- \item[bash -x] hilfreich fürs debugging von Scripten, weil es anzeigt, wie die Variabeln aufgelöst werden
- \item[Passwörter und Passphrases] haben in scripten nicht's verloren
- \end{description}
-
- \pause
- Bitte vergesst nicht Fehler einzubauen, das hat den Größten Lerneffekt
-\end{frame}
-
-
-\begin{frame}
- \frametitle{Ende}
- \large{Vielen Dank fürs zuhören! \\ Habt ihr noch Fragen?}\hfill \break
- \normalsize{
- \colorbox{blue}{\textcolor{white}{Susanne (Bücherratten)}} \\
- \colorbox{blue}{\textcolor{white}{ratten@buecherratten.in-berlin.de}} \\
- \colorbox{blue}{\textcolor{white}{friendica:buecherratte@snarl.de}} \\
- \colorbox{blue}{\textcolor{white}{gpg:fingerprint:}} \\
- \colorbox{blue}{\textcolor{white}{0E42 3FA3 838E E7ED 5AA2}} \\
- \colorbox{blue}{\textcolor{white}{20E7 ACA3 EA4A C038 CCFD}} \\
- }
-\end{frame}
-
-%% #!/bin/bash
-
-%% #Answer to the question:
-%% # When is Congress?
-
-%% Tage=0
-
-%% Datum=$(date +%d-%m)
-%% #Datum=
-%% gruen="\e[32m"
-%% blau="\e[34m"
-%% rot="\033[1;31m"
-%% nc="\033[0m"
-
-%% Tag=$(echo $Datum | cut -d'-' -f1)
-%% Monat=$(echo $Datum |cut -d'-' -f2)
-
-
-
-%% if [[ $Monat == 12 ]]
-%% then
-
-%% if [[ $Tag > 26 && $Tag < 30 ]]
-%% then
-%% echo "It's congress time"
-%% echo -e $blau "visit congress or one of the Congress-Everywhere-stations"$nc
-%% fi
-
-%% if [[ $Tag -lt 26 ]]
-%% then
-%% Tage=$(expr 26 - $Tag)
-%% echo -e $gruen "Es sind noch " $Tage " zum Congress, be prepaired"$nc
-%% elif [[ $Tag == 31 ]]
-%% then
-%% echo -e $rot "Congress is over :-( \n wish you a happy new Year" $nc
-%% fi
-
-%% if [[ $Tag == 24 ]]
-%% then
-%% echo "It's Chrissmess-Time"
-%% fi
-
-%% fi
-
-%% case $Monat in
-
-%% 11)
-%% Tage=$(expr 30 - $Tag + 26)
-%% echo "Es sind noch " $Tage " zum Congress"
-%% ;;
-%% 10)
-%% Tage=$(expr 61 - $Tag + 26)
-%% echo "Es sind noch " $Tage " zum Congress"
-%% ;;
-%% 9)
-%% Tage=$(expr 91 - $Tag + 26)
-%% echo "Es sind noch " $Tage " zum Congress"
-%% ;;
-%% 8)
-%% Tage=$(expr 122 - $Tag + 26)
-%% echo "Es sind noch " $Tage " zum Congress"
-%% ;;
-%% 7)
-%% Tage=$(expr 153 - $Tag + 26)
-%% echo "Es sind noch " $Tage " zum Congress"
-%% ;;
-%% 6)
-%% Tage=$(expr 183 - $Tag + 26)
-%% echo "Es sind noch " $Tage " zum Congress"
-%% ;;
-%% 5)
-%% Tage=$(expr 214 - $Tag + 26)
-%% echo "Es sind noch " $Tage " zum Congress"
-%% ;;
-%% 4)
-%% Tage=$(expr 244 - $Tag + 26)
-%% echo "Es sind noch " $Tage " zum Congress"
-%% ;;
-%% 3)
-%% Tage=$(expr 275 - $Tag + 26)
-%% echo "Es sind noch " $Tage " zum Congress"
-%% ;;
-%% 2)
-%% Schaltjahr=$(date --date='31 Dec' +%j)
-%% if [[ $Schaltjahr == 366 ]]
-%% then
-%% Tage=$(expr 304 - $Tag + 26)
-%% echo "Es sind noch " $Tage " zum Congress"
-%% else
-%% Tage=$(expr 303 - $Tag + 26)
-%% echo "Es sind noch " $Tage " zum Congress"
-%% fi
-%% ;;
-%% 1)
-%% Schaltjahr=$(date --date='31 Dec' +%j)
-%% if [[ $Schaltjahr == 366 ]]
-%% then
-%% Tage=$(expr 335 - $Tag + 26)
-%% echo "Es sind noch " $Tage " zum Congress"
-%% else
-%% Tage=$(expr 334 - $Tag + 26)
-%% echo "Es sind noch " $Tage " zum Congress"
-%% fi
-%% ;;
-
-%% esac
-
-%% #!/bin/bash
-
-%% # Der Adventskalender für die Shell
-
-%% #array deklaration
-%% declare -a xmessup
-
-%% cccTime()
-%% {
-%% xmessup=($ls congress/*)
-
-%% while [[ $Tage != 0 ]]
-%% do
-%% figlet -t waiting for Congress
-%% echo "Es sind noch " $Tage " bis zum Congress"
-%% fortune
-%% zahl=$(expr $day / 2)
-%% if [[ $zahl < 2 ]]
-%% then
-%% zahl=1
-%% fi
-%% feh ${xmessup[$zahl]}
-%% break
-%% done
-
-%% if [[ $Tage == 0 ]]
-%% then
-%% figlet -t "It's congress time"
-%% echo "make sure to have your ticket available or use the Congress-Everywhere-Stations of Congress"
-
-%% for i in $xmessup
-%% do
-%% feh $i
-%% sleep 5
-%% done
-
-%% sleep 5
-%% figlet -tf block "Be exelent to each other"
-%% asciiquarium
-%% exit
-%% fi
-%% }
-
-%% xmess()
-%% {
-%% xmessup=($ls xmessup/*)
-%% figlet -tf block Advent Advent
-%% if [[ $Tage != 0 ]]
-%% then
-%% random=$((RANDOM%17))
-%% if [[ random == 0 ]]
-%% then
-%% fortune
-%% else
-%% zahl=$(expr $day / 2)
-%% if [[ $zahl < 2 ]]
-%% then
-%% zahl=1
-%% fi
-%% feh ${xmessup[$zahl]}
-%% fi
-%% cowsay -f tux "Have a nice Xmess-Time"
-%% exit
-%% else
-%% figlet -tf block marry chrismess
-%% echo "hier is a shell-present for you:"
-%% ascciquarium
-%% exit
-%% fi
-%% }
-
-
-%% choose()
-%% {
-%% read -p "Soll der Adventskalender bis Weihnachten (w) oder bis zum Congress (c) gehen? " Endpunkt
-
-%% if [[ $Endpunkt == "w" ]]
-%% then
-%% Tage=$(expr 24 - $day)
-%% xmess
-%% elif [[ $Endpunkt == "c" ]]
-%% then
-%% Tage=$(expr 26 - $day)
-%% cccTime
-%% else
-%% echo "Sorry, I dont understand your answer, please use >>w<< or >>c<< to answer"
-%% choose
-%% fi
-%% }
-
-%% main()
-%% {
-%% month=$(date +%m)
-%% day=$(date +%d)
-%% if [[ $month == 12 && $day < 27 ]]
-%% then
-%% choose
-%% else
-%% echo "This is only working in December and until 26th of December"
-%% exit
-%% fi
-%% }
-
-%% main
-
-
-
-
-\end{document}
--- /dev/null
+\documentclass[graphicx,aspectratio=169]{beamer}
+
+\usepackage[usenames, dvipsnames]{xcolor}
+\usepackage[ngerman]{babel}
+\usepackage[utf8]{inputenc}
+\usepackage{tipa}%für die pipe
+
+\usepackage{textpos}
+\usepackage{pgfpages} %für notizen in Slides
+
+\usepackage{tcolorbox}%runde colorboxen \usepackage{textpos}
+
+\usepackage{stmaryrd} % \shortrightarrow
+
+\usepackage[final]{qrcode}%für qrcodes
+\usepackage{hyperref}
+%\usepackage{showkeys}
+
+\uselanguage{German}
+\languagepath{German}
+
+\definecolor{kuerzung}{RGB}{254, 198, 1}
+\definecolor{orange}{RGB}{234, 155, 23}
+\definecolor{dunkelblau}{RGB}{11, 12, 93}
+\definecolor{gruen}{RGB}{137, 252, 0}
+\definecolor{gruendunkel}{RGB}{172, 210, 237}
+\definecolor{titelblau}{RGB}{21, 59, 80}
+\definecolor{blau}{rgb}{0.7, 0.99, 0.99}
+\definecolor{coolblack}{rgb}{0.0, 0.18, 0.39}
+\definecolor{DarkGreen}{rgb}{0.0, 0.6, 0.0}
+\definecolor{ao}{rgb}{0.12, 0.3, 0.17}
+\definecolor{realRFC}{rgb}{0.1, 0.1, 0.44}
+\definecolor{witzRFC}{rgb}{0.01, 0.75, 0.24}
+\definecolor{prefix}{rgb}{0.5, 0.5, 0.0}
+\definecolor{IID}{rgb}{0.56, 0.0, 1.0}
+\definecolor{CIDR}{rgb}{0.0, 0.29, 0.29}
+
+\mode<handout>{%
+
+ \setbeameroption{show notes}
+ %\setbeamerfont{note page}{size=\large}
+ %\setbeameroption{show notes on second screen=bottom}
+ \setbeamertemplate{note page}{%
+ \vspace{1cm}
+ weitere Informationen:\\
+ \vskip.25em
+ \nointerlineskip
+ {\Huge \insertframetitle}
+ \vskip.25em
+ {\Large\insertframesubtitle}
+ \vskip.25em
+ %\vspace{1cm}\\
+ \insertnote}
+}
+
+\mode<beamer>{%
+ \setbeamerfont{note page}{size=\Large}
+ \setbeameroption{show notes on second screen=bottom}
+ \setbeamertemplate{note page}{%
+ \begin{columns}
+ \begin{column}{0.2\textwidth}
+ \insertslideintonotes{0.25}
+ \end{column}
+ \begin{column}{0.7\textwidth}
+ \begin{center}
+ Speaker Notes:\\
+ \insertframetitle \break
+ \insertframesubtitle
+ \end{center}
+ \end{column}
+ \end{columns}
+ \vspace{-0.6cm}
+ {\Huge\insertnote}
+ }
+}
+
+\usetheme[hideothersubsections,left]{Goettingen}
+
+\graphicspath{{Bilder/}}
+
+% minted Optionen
+\usepackage{lineno}
+\usepackage[newfloat]{minted}
+\usemintedstyle{friendly}
+\usemintedstyle[sourcelist,linux-config]{autumn}
+\usemintedstyle[console]{staroffice}
+\usemintedstyle[bash]{pastie}
+
+\setminted[bash]{
+ breaklines=true,
+ tabsize=2,
+ linenos,
+ numbersep=2pt,
+ autogobble,
+ framesep=0pt
+}
+
+\setminted[linux-config]{
+ breaklines=true,
+ linenos,
+ numbersep=2pt,
+ autogobble,
+ framesep=0pt
+ }
+
+\setminted[console]{
+ breaklines=true,
+ linenos,
+ numbersep=2pt,
+ autogobble,
+ framesep=0pt
+ }
+
+\setbeamercovered{transparent}
+\useoutertheme{sidebar}
+\useinnertheme{rounded}
+
+%um descripten links auszurichten
+
+\defbeamertemplate{description item}{align left}{\insertdescriptionitem\hfill}
+\setbeamertemplate{description item}[align left]
+
+%Beispiel Farb Definition
+\setbeamercolor{block title example}{use=example text,fg=example text.fg,bg=example text.fg!20!bg}
+\setbeamercolor{block body example}{parent=normal text,use=block title example,bg=block title example.bg!50!bg}
+
+%DefintionsBlock Farbspezification
+
+\setbeamercolor{block title}{use=structure text,fg=blue,bg=example text.fg!20!bg}
+\setbeamercolor{block body}{parent=normal text,use=block title example,bg=block title example.bg!50!bg}
+
+\setbeamertemplate{frametitle}[default][center]
+\setbeamertemplate{navigation symbols}{}
+\setbeamertemplate{page number in head/foot}[totalframenumber]
+
+% fußzeilen Definition
+
+\setbeamertemplate{footline}{\vspace*{-20pt} \leavevmode%
+ \hbox{%
+ \hspace{2cm} \colorbox{white}{\color{black}
+ \insertdate \hspace{1.5cm} \insertshortauthor \hspace{6cm} \insertframenumber }}}
+
+\setbeamertemplate{itemize items}[triangle]
+\setbeamertemplate{page number in foot}[totalframenumber]
+
+% sidebarsetting
+\setbeamertemplate{sidebar canvas left}[vertical shading][top=ao,middle=titelblau,bottom=DarkGreen]
+\setbeamercolor{section in sidebar shaded}{fg=yellow}
+\setbeamercolor{author in sidebar}{fg=ao}
+\setbeamercolor{title in sidebar}{fg=white}
+
+% Sidebar Farben normal
+
+\setbeamercolor{section in sidebar shaded}{fg=blau}
+\setbeamercolor{subsection in sidebar shaded}{fg=Yellow}
+\setbeamercolor{subsubsection in sidebar shaded}{fg=SpringGreen}
+
+%Sidebar Farben aktiviert
+
+\setbeamercolor*{palette sidebar primary}{fg=YellowOrange}
+\setbeamercolor*{palette sidebar secondary}{fg=YellowOrange}
+
+\setbeamercolor{titlelike}{fg=white, bg=titelblau}
+
+% %itemsetting
+
+\setbeamercolor{item}{fg=blue}%color of bullet
+\setbeamercolor{subitem}{fg=orange}%color of bullet
+
+%inhaltsverzeichniss
+\setbeamercolor{section in toc}{fg=blue}%, bg=black}
+
+\setbeamercolor{subsection in toc}{fg=DarkGreen}
+\setbeamercolor{subsubsection in toc}{fg=teal}
+\setbeamertemplate{sections/subsections in toc}[triangle]
+
+%\setbeamertemplate{blocks}[rounded]
+
+\setbeamertemplate{title page}[default][colsep=-4bp,rounded=true]
+
+\begin{document}
+
+\title[A Way to (S)HELL]{\textbf{A Way to HELL}}
+\subtitle{\textbf{ein Einstieg in die Programmierung mit bash}}
+
+\author{Susanne Schütze}
+\institute{38c3 Haecksen}
+\date{30.12.2024}
+
+%Background
+
+\setbeamercolor{background canvas}{bg=white}
+\setbeamertemplate{background}{%
+ \includegraphics[height=\paperheight,width=\paperwidth]{bash-on-fire.png}}
+
+%sitebar leer setzten
+\setbeamertemplate{sidebar left}{}
+
+%notepage with itemize
+\makeatletter
+\def\beamer@setupnote{%
+ \gdef\beamer@notesactions{%
+ \beamer@outsideframenote{%
+ \beamer@atbeginnote%
+ \beamer@notes%
+ \ifx\beamer@noteitems\@empty\else
+ \begin{itemize}\itemsep=0pt\parskip=0pt%
+ \beamer@noteitems%
+ \end{itemize}%
+ \fi%
+ \beamer@atendnote%
+ }%
+ \gdef\beamer@notesactions{}%
+ }
+}
+\makeatother
+
+%titlepage ohne sidebar
+\makeatletter
+\begin{frame}[plain]
+ \hspace*{-\beamer@sidebarwidth}%
+ \advance\textwidth by \beamer@sidebarwidth\relax
+ \beamer@sidebarwidth=\z@
+ \begin{minipage}{\textwidth}
+ \maketitle
+ \end{minipage}
+\end{frame}
+
+\makeatother
+\setbeamertemplate{background}
+
+\begin{frame}[shrink]
+ \frametitle{Inhalt}
+ \textbf{\tableofcontents[hideothersubsections]}
+ \vspace{0.4cm}
+\end{frame}
+
+%sidebar wiederherstellen
+\setbeamertemplate{sidebar left}[sidebar theme]
+
+\subsection{whoami}
+\begin{frame}
+ \frametitle{whoami}
+ \begin{itemize}
+ \item{Susanne}
+ \item{40 Jahre}
+ \item{Pronomen: sie}
+ \item{Berufsbezeichnung: Fachinformatikerin für Systemintegration}
+ \item{Berufliches Themenfeld: Linux Client Management}
+ \item{Linuxerin seit Kernel 2.6.24 (2009)}
+ \item{Zugehörigkeiten zu: Haecksen, BeLUG, FSFE}
+ \end{itemize}
+ URL zu Folien und Handout:
+ \vspace{0.2cm}
+ \begin{columns}
+ \only<beamer>{\begin{column}{0.2\textwidth}
+ \qrcode[hyperlink,height=1.5cm]{http://git.tuxteam.de/gitweb/?p=susannes-git/A_Way_to_Shell.git;a=tree;h=refs/heads/main;hb=refs/heads/main}
+ \end{column}}
+ \begin{column}{0.8\textwidth}
+ \url{http://http://git.tuxteam.de/gitweb/?p=susannes-git/A_Way_to_Shell.git;a=tree;h=refs/heads/main;hb=refs/heads/main}
+ \end{column}
+ \end{columns}
+\end{frame}
+
+\section{Liste}
+\begin{frame}
+ \frametitle{Einkaufsliste}
+ \framesubtitle{Was wird gebraucht?}
+
+ \begin{itemize}
+ \item{aktuelles Linux (je nach Distro gibt es andere Eastereggs ;-))}
+ \item{Terminal (bash)}
+ \pause
+ \item{Packages:}
+ \begin{itemize}
+ \item{sl}
+ \item{cowsay}
+ \item{figlet}
+ \item{fortune-mod}
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\section{How to Skript}
+
+\subsection{Rezepte erstellen}
+\begin{frame}[fragile]
+ \frametitle{Schreibe ein Rezept}
+ \framesubtitle{Skripte schreiben}
+ \large{Befehle zusammenpacken}
+ \normalsize{
+ \begin{itemize}
+ \item{Den lieblings-Texteditor (vim, emacs, nano, geany, gedit, kate, Leafpad, Mousepad...) benutzten}
+ \item{Befehle in der Reihenfolge aufschreiben, in der sie ausgeführt werden sollen}
+ \note[item]{bash arbeitet von oben nach unten, alle Befehle ab}
+ \item{beim Speichern Dateiextension (.sh) nicht notwendig}
+ \item{ausführen und Spaß haben}
+ \end{itemize}
+ \pause
+ \begin{minted}{bash}
+ ./name #sourcen erfordert Ausführungsrechte
+ bash name #bash mach mal name
+ \end{minted}
+ }
+\end{frame}
+
+\subsection{Zeilen im Skript}
+\begin{frame}[fragile]
+ \frametitle{alles in einer Zeile}
+ \framesubtitle{Beispiel}
+ \begin{minted}{bash}
+Zahl= ;Wort= ;i=; for ((i=1 ; i<=15 ; i++)); do Zahl=$((RANDOM%134+1));Wort="$(sed -n "$Zahl p" liste.txt)";echo $Wort;echo $Wort >> dat.txt;done;echo -e '\n \n \t' " Viel Glück beim merken";sleep 2m;clear;echo -e '\n' "Mach mal 10 min was anderes!";sleep 10m;echo -e '\n \a' "Es geht jetzt los" '\n';Ergeb= ;r=0;f=0; echo "Schreibe die gemerkten Worte in der richtigen Reihenfolge auf"; for i in `seq 1 15`;do read Ergeb$i;if [ "$(eval echo \$Ergeb$i)" = "$(sed -n "$i p" dat.txt)" ] ; then echo -e "Richtig!" '\n'; ((r++)); else echo -e "Falsch!" '\n'; ((f++)); fi; done; echo "Die richitgen Wörter waren:";cat dat.txt;echo "Du hast " $r " Wörter richtig! und " $f " Wörter falsch";rm dat.txt
+ \end{minted}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Eingerückt}
+ \framesubtitle{Beispiel}
+ \begin{columns}[T]
+ \begin{column}{0.5\textwidth}
+ \begin{minted}[fontsize=\footnotesize,breakanywhere]{bash}
+ #!/bin/bash
+ Z= ; E=
+ W= ; r=0
+ i= ; f=0
+ for ((i=1 ; i<=15 ; i++))
+ do
+ Z=$((RANDOM%134+1))
+ W="$(sed -n "$Z p" liste.txt)"
+ echo $W
+ echo $W >> dat.txt
+ done
+ echo -e '\n \n \t' " Viel Glück beim merken"
+ sleep 2m
+ clear
+ echo -e '\n' "10 min Warten!"
+ sleep 10m
+ \end{minted}
+ \end{column}
+ \begin{column}{0.5\textwidth}
+ \begin{minted}[fontsize=\footnotesize,breakanywhere]{bash}
+ echo -e '\n \a' "Es geht jetzt los"
+ echo "Schreibe die Wörter auf:"
+ for i in `seq 1 15`
+ do
+ read E$i
+ if [ "$(eval echo \$E$i)" = "$(sed -n "$i p" dat.txt)" ]
+ then echo -e "Richtig!" '\n'
+ ((r++))
+ else echo -e "Falsch!" '\n'
+ ((f++))
+ fi
+ done
+ echo "Die richtigen Wörter waren:"
+ cat dat.txt
+ echo "Du hast $r richtig! und $f falsch"
+ rm dat.txt
+ \end{minted}
+ \end{column}
+ \end{columns}
+ \vspace{0.5cm}
+\end{frame}
+
+\subsection{sprechende Namen im Skript}
+\begin{frame}[fragile]
+ \frametitle{sprechende Namen im Skript}
+ \framesubtitle{Beispiel}
+ \begin{minted}[fontsize=\footnotesize,breakanywhere]{bash}
+ #!/bin/bash
+ Zahl=
+ Wort=
+ i=
+ for ((i=1 ; i<=15 ; i++))
+ do
+ Zahl=$((RANDOM%134+1))
+ Wort="$(sed -n "$Zahl p" liste.txt)"
+ echo $Wort
+ echo $Wort >> dat.txt
+ done
+ echo -e '\n \n \t' " Viel Glück beim merken"
+ sleep 2m
+ clear
+ echo -e '\n' "Mach mal 10 min was anderes!"
+ sleep 10m
+ \end{minted}
+\end{frame}
+
+\subsection{Kommentare}
+
+\begin{frame}
+ \frametitle{Wer braucht schon Erklährungen im Code}
+ \framesubtitle{Kommentare}
+ \# Niemand hat die Absicht, Hash-Tags als Kommentar zu benutzen\\
+ Der Code dokumentiert sich stets von selbst\\
+ \pause
+ \#Für Kommentare wird der ganze Latten-Zaun benutzt\\
+ \pause
+ \#Die Kommentare waren zuerst da!
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{mit Kommentare}
+ \framesubtitle{Beispiel}
+ \begin{minted}[fontsize=\footnotesize,breakanywhere]{bash}
+ #!/bin/bash # Variablen Deklaration Zahl=
+ Wort=
+ i=
+ #For schleife zum durchzählen
+ for ((i=1 ; i<=15 ; i++))
+ do
+ #Zufallszahl ausgeben #echo $RANDOM
+ #Da der Zufall größer ist als die Textdatei wird Der Bereich gekürzt
+ #echo $(($RANDOM %100)) #jetzt wäre der Bereich nur bis 99 groß, das muss erweiter werden Zahl=$((RANDOM%134+1))
+ #Die Zufallszahl wird in der Variabel Zahl gespeichert #Nun soll die Zeile mit der entspechenden Nummer ausgegeben werden Wort="$(sed -n "$Zahl p" liste.txt)"
+ echo $Wort
+ echo $Wort >> dat.txt
+ #Schreibt das Wort zusätzlich in eine Datei
+ #Jetzt noch ne Schleife drumrumbauen done
+
+ echo -e '\n \n \t' " Viel Glück beim merken"
+ sleep 2m
+ \end{minted}
+\end{frame}
+
+\subsection{Pipes}
+\begin{frame}[fragile]
+ \frametitle{Auf der Leitung stehen}
+ \framesubtitle{Was ist eine Pipe?}
+ \begin{itemize}
+ \item{Die Ausgabe eines Befehls an einen anderen weitergeben}
+ \item{\Huge{\textpipe}}
+ \end{itemize}
+ \bigskip
+ \begin{minted}{bash}
+ fortune | cowsay
+ \end{minted}
+ Das geht beliebig oft
+\end{frame}
+
+\subsection{Konvertionen}
+\begin{frame}[fragile]
+ \frametitle{Typographische Konvertionen}
+ \framesubtitle{How-to}
+ Sind nirgendwo eindeutig festgeschrieben. Folgende werden häufig eingesetzt:
+ \begin{itemize}
+ \item{sprechende Namen für Funktionen und Variablen verwenden}
+ \item{Quotes hilfreich wenn Variablen leerzeichen enthalten geschweifte Klammern nur für bestimmte Situationen erforderlich}
+ \mintinline{bash}{"${variable}"}
+ \item{test wird häufig als [ ] oder [[ ]], geschrieben, wobei letzteres sauberer ist, für die bash}
+ \item{Variablen kleingeschreiben um mit Umgebungsvariabeln und OS-Variablen nicht ins gehege zu kommen}
+ \item{= vs == meistens wird == verwendet wie in anderen Programmiersprachen}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{bang!bang!bang!}
+ \framesubtitle{Was macht das shebang?}
+ \begin{itemize}
+ \item{die Skript-Sprache verraten}
+ \pause
+ \item{Das Shebang ist wichtig, wenn Irrtümer vermieden werden sollen}
+ \item{Das Skript nicht unbedingt mit der Scriptsprache vorne weg gestartet wird.}
+ \item{Das Skript aus einer anderen Shell csh,fish,zsh aufgerufen wird}
+ \end{itemize}
+ \pause
+ \begin{minted}{bash}
+ #!/bin/bash
+ \end{minted}
+ \pause
+ Vorsicht! der Pfad kann je nach Linux anders sein: \mintinline{bash}{whereis bash}
+\end{frame}
+
+\subsection{Debugging}
+\begin{frame}[fragile]
+ \frametitle{Debugging}
+ \framesubtitle{How-to}
+ \begin{itemize}
+ \item{beenden im Fehlerfall \mintinline{bash}{set -o errexit} oder \mintinline{bash}{set -e}}
+ \item{prüft ungesetze Variablen funktioniert nicht mit Umgebungsvariabeln \mintinline{bash}{set -o nounset} oder \mintinline{bash}{set -u}}
+ \item{schreibt mit was gerade ausgeführt wird, dabei werden Variablen aufgelöst \mintinline{bash}{ set -o xtrace} oder \mintinline{bash}{set -x}}
+ \item{fancy Debugger muss nachinstalliert werden \mintinline{bash}{shellcheck}}
+ \end{itemize}
+\end{frame}
+
+\subsection{hilfe}
+\begin{frame}
+ \frametitle{lese das Handbuch}
+ \framesubtitle{rtfm}
+ \Huge{man man\\
+ \pause
+ man bash\\
+ \pause
+ info bash\\
+ \pause
+ apropos / whatis}
+\end{frame}
+
+\section{Variablen}
+\begin{frame}[fragile]
+ \frametitle{Was ist in der Tasse?}
+ \framesubtitle{Variablen}
+ \begin{itemize}
+ \item{denk dir ein Wort oder Buchstaben aus}
+ \item{weise diesem Wort oder Buchstaben etwas zu}
+ \item{keine Gedanken um Datentypen machen}
+ \end{itemize}
+ \pause
+ Variablen Zuweisung:
+ \begin{minted}{bash}
+ Tasse=10
+ B1-Tasse=Pinguin
+ command=$(fortune)
+ \end{minted}
+ Benutzung:
+ \begin{minted}{bash}
+ echo $Tasse
+ echo $B1-Tasse
+ echo $command
+ \end{minted}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Variablen}
+ \framesubtitle{schlechte Ideen}
+ Was besser nicht gemacht wird:
+ \begin{itemize}
+ \item{einem bash-Befehl als Variable benutzen}
+ \begin{minted}{bash}
+ apt=moo
+ \end{minted}
+ \begin{minted}{console}
+ apt=moo
+ echo $apt
+ moo
+ \end{minted}
+ \item{Leerzeichen um das Gleichheitszeichen}
+ \begin{minted}{bash}
+ Tasse = lecker
+ \end{minted}
+ \begin{minted}{console}
+ Tasse = lecker
+ command Tasse not found
+ \end{minted}
+ \end{itemize}
+\end{frame}
+
+\section{Code verteilen}
+\begin{frame}[fragile,shrink]
+ \frametitle{f(x)}
+ \framesubtitle{Funktionen}
+ Teile und Herrsche
+ \newline
+ Funktionen können:\\
+ \begin{itemize}
+ \item{Code-Wiederholungen vermeiden}
+ \item{übersichtlichere Strukturen schaffen}
+ \item{die Lesbar erleichtern}
+ \end{itemize}
+ \pause
+ \begin{minted}{bash}
+ #/bin/bash
+ datumsfrage()
+ {
+ cowsay -f dragon "Haben wir heute den $(date) ?"
+ }
+ datumsfrage
+ \end{minted}
+\end{frame}
+
+\section{Kommunikationsskills}
+\begin{frame}[fragile]
+ \frametitle{Kommunikation mit Usern}
+ \framesubtitle{Ein-/Ausgabe}
+ Wenn Text im Terminal ausgegeben werden soll, wird \mintinline{bash}{echo} als Befehl verwendet:
+ \begin{minted}{bash}
+ echo "Was macht ein Pirat am Computer?"
+ echo "Enter drücken"
+ \end{minted}
+ \pause
+ Wenn wir den Nutzer unseres Programms etwas eingeben lassen wollen, können wir \mintinline{bash}{read} verwenden:
+ \begin{minted}{bash}
+ echo "Was macht ein Pirat am Computer?"
+ read Antwort
+ echo "Enter drücken"
+ echo "deine Antwort war $Antwort"
+ \end{minted}
+\end{frame}
+
+\section{Logik}
+\begin{frame}[fragile]
+ \frametitle{Wie funktioniert die Logik?}
+ \framesubtitle{testen, testen, testen}
+ Warum testen?
+ \begin{itemize}
+ \item{ich will wissen, ob etwas richtig ist}
+ \item{ich will abhänig vom Wert einer Variable etwas tun}
+ \item{ich will etwas nicht tun wenn \dots}
+ \end{itemize}
+ \pause
+ \begin{minted}{bash}
+ read -p "Was packst du in die Tasse? " Tasse
+ test $Tasse = "Mate"
+ echo $?
+ # andere Schreibweise:
+ [ $Tasse = "Mate" ]
+ echo $?
+ # oder:
+ [[ $Tasse = "Mate" ]]
+ \end{minted}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Wie funktioniert die Logik}
+ \framesubtitle{Logische Verknüpfungen}
+ \begin{description}
+ \item[UND] Prüfen, ob alle Tests wahr sind
+ \begin{minted}{bash}
+ i="Du"
+ Tasse="Kaffee"
+ test $i = "Du" && [ $Tasse = "Kaffee" ]
+ echo $?
+ \end{minted}
+ \pause
+ \item[ODER] Prüfen, ob ein Test von mehreren wahr ist
+ \begin{minted}{bash}
+ B1_Tasse="Tee"
+ Tasse="Kaffee"
+ test $B1_Tasse = "1x" || [ $Tasse = "Kaffee" ]
+ echo $?
+ \end{minted}
+ \pause
+ \item[nicht] Prüfen, ob ein Test falsch ist
+ \begin{minted}{bash}
+ Tasse="Tee"
+ test $Tasse != "Kaffee"
+ echo $?
+ \end{minted}
+ \end{description}
+ \pause
+ Das ganz kann beliebig verknüpft werden - Also viel Spaß
+\end{frame}
+
+\section{Wenn...}
+\begin{frame}[fragile]
+ \frametitle{Wenn Du nicht sofort tust was ich sage, Dann ...}
+ \framesubtitle{Verzweigungen}
+ if\\
+ Wenn, prüfe ob das wahr ist, dann...
+ \begin{minted}{bash}
+if test "$Tasse" = "Kaffee"; then echo "lecker"; fi
+if [[ $Tasse == "Tee" ]] ; then echo "lecker" ; else cowsay "Ostfriese";fi
+if [[ -z $Tasse ]] ; then echo "Tasse leer"; elif test $Tasse = "Kaffee" ; then cowsay "lecker $Tasse " ; else cowsay "So'n Tee";fi
+ \end{minted}
+ \pause
+ \begin{description}
+ \item[else] muss nicht unbdeingt verwendet werden
+ \pause
+ \item[elif Bedingung] mehrfach Ververkettungen
+ \pause
+ \item[-z] Die Länge der ZEICHENKETTE ist Null
+ \pause
+ \item[ = vs == ] egal, solange Leerzeichen verwendet werden
+ \end{description}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Boxen}
+ \framesubtitle{Wenn Variablen nicht ausreichen}
+ Was sind Arrays?\\
+ eine Box für mehrere Werte
+ \begin{minted}{bash}
+ Box=(1 pinguin 3 4)
+ echo $Box
+ #mit index
+ echo ${Box[2]}
+ #gesamtes Array
+ echo ${Box[*]}
+ echo ${Box[@]}
+ \end{minted}
+ \small{hint: * und @ unterscheiden sich.\\ @ hat Newline zwischen den Index-Werten (wird beim looping fliegen relevant).}
+\end{frame}
+
+\section{Loopings}
+
+\begin{frame}[fragile]
+ \frametitle{Schleifen binden und durch loopings fliegen}
+ \framesubtitle{while}
+ \textcolor{red}{solange} etwas stimmt, mach etwas!
+ \begin{minted}{bash}
+Tasse="5"
+while [[ $Tasse -gt 3 ]]
+do
+fortune
+((Tasse--))
+echo "es sind $Tasse Murmeln in der Tasse"
+done
+ \end{minted}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Schleifen binden und durch loopings fliegen}
+ \framesubtitle{until}
+ \textcolor{red}{bis} etwas stimmt, mach etwas!
+ \begin{minted}{bash}
+Tasse="7"
+until [[ $Tasse -lt 5 ]]
+do
+((Tasse--))
+apropos brain?
+echo "es sind $Tasse Murmeln in der Tasse"
+done
+ \end{minted}
+\end{frame}
+
+
+\begin{frame}[fragile]
+ \frametitle{Schleifen binden und durch loopings fliegen}
+ \framesubtitle{for}
+ \textcolor{red}{bis etwas die Zahl n} erreicht hat, mach etwas!\\
+ Wird häufig für Arrays benutzt\\
+ \begin{minted}{bash}
+j=0
+blubb=(einmal Mate bitte)
+for $i in ${blubb[@]}
+do
+((j++))
+echo "An Stelle $j steht " $i
+done
+\end{minted}
+ \begin{description}
+ \item[Inkrement] erhöhe um 1 ((i++))
+ \item[Dekrement] verringere um 1) ((i-\,-))
+ \end{description}
+ \end{frame}
+
+\section{Rechen-Meister}
+\begin{frame}[fragile]
+ \frametitle{Mathe und bash}
+ \framesubtitle{Rechnen in der Shell}
+ \dots geht, aber \dots\\
+ \begin{itemize}
+ \item{\mintinline{bash}{expr 2 \* 4}}
+ \item{\mintinline{bash}{let x=2*4 ; echo $x}}
+ \item{\mintinline{bash}{ echo "2*4" | bc } bitte das Packet bc installieren}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Tipps und Tricks}
+ \begin{description}
+ \item[script] zeichnet auf, was in der Shell passiert (inklusive der Typos)
+ \item[scriptreplay] spielt wieder ab, was ihr aufgezeichnet habt, mit timing-Datei sogar in Echtzeit
+ \item[Passwörter und Passphrases] haben in Scripten nichts verloren
+ \item[root-Rechte ins Skripten erlangen] lasst es sein
+ \end{description}
+ \pause
+ Bitte vergesst nicht, Fehler einzubauen, das hat den Größten Lerneffekt
+\end{frame}
+
+\section{The End of Talk}
+\begin{frame}
+ \frametitle{Ende}
+ \large{Vielen Dank fürs zuhören! \\ Habt ihr noch Fragen?}
+
+\end{frame}
+
+\appendix
+
+\section{Im Fall von...}
+\begin{frame}[fragile]
+ \frametitle{Im Fall vom, tue ...}
+ \framesubtitle{Verschachtelungen}
+ Wenn if für die Verschachtelungen unübersichtlich werden:
+ \begin{minted}{bash}
+case $Tasse in
+Kaffee)
+cowsay -f tux "Lecker Kaffee"
+;;
+Tee)
+cowsay -f turtle "Lecker Tee"
+;;
+*)
+cowsay -f ghostbusters "hmm Irgendwas"
+;;
+esac
+ \end{minted}
+ \pause
+ lässt sich nur im Skript benutzen, nicht in der Kommandozeile
+\end{frame}
+
+\end{document}