From: ratten Date: Sun, 22 Dec 2024 19:11:55 +0000 (+0100) Subject: remove old presentation X-Git-Url: http://git.tuxteam.de/gitweb/?a=commitdiff_plain;h=30093ef780ebdc3b9b74609e1c07c4909bfd7c02;p=susannes-git%2FA_Way_to_Shell.git remove old presentation --- diff --git a/my-way-to-shell.pdf b/my-way-to-shell.pdf deleted file mode 100644 index 5f80d0a..0000000 Binary files a/my-way-to-shell.pdf and /dev/null differ diff --git a/my-way-to-shell.tex b/my-way-to-shell.tex deleted file mode 100644 index 28bc35b..0000000 --- a/my-way-to-shell.tex +++ /dev/null @@ -1,796 +0,0 @@ -\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} diff --git a/way-to-shell.pdf b/way-to-shell.pdf new file mode 100644 index 0000000..ed41dbc Binary files /dev/null and b/way-to-shell.pdf differ diff --git a/way-to-shell.tex b/way-to-shell.tex new file mode 100644 index 0000000..033e7d5 --- /dev/null +++ b/way-to-shell.tex @@ -0,0 +1,791 @@ +\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{% + + \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{% + \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{\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}