\documentclass[xcolor,graphicx,handout]{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]{A Way to HELL}
\subtitle{Einführung in die Programmierung mit bash}

\author{Bücherratten}
\institute{LinuxWorks!}
\date{19.12.2019}

{
\usebackgroundtemplate{\includegraphics[height=\paperheight]{/home/ratten/igitt/doku/Vortrag/bash-Vortrag/bash-on-fire.png}}

\begin{frame}
\maketitle
\end{frame}

\title{MY Way to (S)HELL}
\subtitle{Einführung in die Programmierung mit bash}

\author{Bücherratten}
\institute{LinuxWorks!}
\date{19.12.2019}

\begin{frame}
\maketitle
\end{frame}
}
\section{RTFM}
\begin{frame}
  \frametitle{lese das Handbuch}
  \framesubtitle{rtfm}
  \Huge{man man
    \pause
    \\ man bash\\
    \pause
    apropos\\}  
  \pause
  \normalsize
\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{figlet}
    \item{feh}
    \item{ssh}
    \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{Ostereier auch Eastereggs genannt suchen}
     \item{SubShells in der SubShell}
     \end{itemize}
  \end{itemize}}        
\end{frame}

\section{step by step}

\begin{frame}
  \frametitle{Wer brauch schon Erklährungen im Code?}
  \framesubtitle{Kommentare}

  \#Niemand hat die Absicht, Hash-Tags als Kommentar zu missbrauchen \\
  \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
\end{verbatim}  
\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}
    \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?
  \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 is 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
  \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 rund ein der Schliefe geprüft\\
    mach etwas
\begin{verbatim}
   i=0

   until [[ $i -eq 10 ]]
   do
      ((i++))
      whereis 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.}
  \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{Advent Advent}
\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
  \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{vergiss die Einrückungen von Code-Zeilen - das ist nur was für DAUs}
    \pause
  \item{speichere dein Werk unter einem Namen, aber auf keine Fall mit der Endung .~sh (es läßt sich auch ohne Datei-extention unter Linux ausführen)}
    \pause
  \item{teste auf keinen Fall, ob es funktioniert}
    \pause
  \item{ausführen und Spaß haben}
  \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{keinem die Script-sprache verraten}
  \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}
  }
\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
  \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}
