1 \documentclass[xcolor,graphicx,handout]{beamer}
2
3 \usepackage[ngerman]{babel}
4 \usepackage[utf8]{inputenc}
5
6 \usepackage{tipa}
7
8 \usetheme{Marburg}
9 \usecolortheme{albatross}
10
11 \setbeamertemplate{navigation symbols}{}
12 \setbeamertemplate{footer}{\insertslidenumber}
13 \setbeamertemplate{itemize items}[triangle]
14
15 \setbeamertemplate{page number in head/foot}[totalframenumber]
16
17 \begin{document}
18
19 \setbeamercolor{author}{fg=black}
20 \setbeamercolor{institute}{fg=green}
21 \setbeamercolor{date}{fg=black}
22 \setbeamercolor{title}{fg=black}
23 \setbeamercolor{subtitle}{fg=blue}
24
25 \title[My Way to (S)HELL]{A Way to HELL}
26 \subtitle{Einführung in die Programmierung mit bash}
27
28 \author{Bücherratten}
29 \institute{LinuxWorks!}
30 \date{19.12.2019}
31
32 {
33 \usebackgroundtemplate{\includegraphics[height=\paperheight]{/home/ratten/igitt/doku/Vortrag/bash-Vortrag/bash-on-fire.png}}
34
35 \begin{frame}
36 \maketitle
37 \end{frame}
38
39 \title{MY Way to (S)HELL}
40 \subtitle{Einführung in die Programmierung mit bash}
41
42 \author{Bücherratten}
43 \institute{LinuxWorks!}
44 \date{19.12.2019}
45
46 \begin{frame}
47 \maketitle
48 \end{frame}
49 }
50 \section{RTFM}
51 \begin{frame}
52 \frametitle{lese das Handbuch}
53 \framesubtitle{rtfm}
54 \Huge{man man
55 \pause
56 \\ man bash\\
57 \pause
58 apropos\\}
59 \pause
60 \normalsize
61 \textcolor{red}{Disklaimer: Dieser Vortrag hat keinen Anspruch auf Vollständigkeit! Sondern Spaß!}
62 \end{frame}
63
64 \section{Liste}
65
66 \begin{frame}
67 \frametitle{Einkaufsliste}
68 \framesubtitle{Was wird gebraucht?}
69
70 \begin{itemize}
71 \item{aktuelles Linux}
72 \item{Terminal}
73 \pause
74 \item{Packages}
75 \begin{itemize}
76 \item{sl}
77 \item{ascii-quarium (komplizierter, weil kein fertiges Package für Debian-basierende Systeme)}
78 \item{cowsay}
79 \item{figlet}
80 \item{feh}
81 \item{ssh}
82 \item{script}
83 \item{fortune}
84 \end{itemize}
85 \end{itemize}
86 \end{frame}
87
88 \section{Bash-Exkurse}
89 \begin{frame}[shrink]
90 \frametitle{bash}
91 \framesubtitle{Unser Werkzeugkasten}
92 \large{kleiner Exkurs zur Bash}
93 \normalsize{
94 \begin{itemize}
95 \item{erster Release war 1989}
96 \item{name ist ein Akkronym für Bourne-Again Shell}
97 \item{ist der Ersatz für die Bourne Shell}
98 \item{Steht unter GPLv3 (bei macOS wurde deswegen auf zsh umgestellt)}
99 \pause
100 \item{es ist nicht die einzige Shell unter Unix-Systemen (es gibt sehr viel mehr), aber Default}
101 \item{Die Shell ist eine der Schnittstelle zwischen Benutzer und Betriebssystem}
102 \pause
103 \item{es gibt ziemlich viel Unterstützung für die einzelnen Befehle}
104 \item{sehr mächtig, (kann fast alles, bis auf kaffee kochen)}
105 \item{Erreichbarkeit: mit dem Shortcut: ALT STRG F1 oder ihr nutzt das pseudo-terminal eurer Wahl}
106 \pause
107 \item{was wir nicht machen können - aus Zeitlichen Gründen}
108 \begin{itemize}
109 \item{mit Farben spielen}
110 \item{Ostereier auch Eastereggs genannt suchen}
111 \item{SubShells in der SubShell}
112 \end{itemize}
113 \end{itemize}}
114 \end{frame}
115
116 \section{step by step}
117
118 \begin{frame}
119 \frametitle{Wer brauch schon Erklährungen im Code?}
120 \framesubtitle{Kommentare}
121
122 \#Niemand hat die Absicht, Hash-Tags als Kommentar zu missbrauchen \\
123 \pause
124 \#Die Kommentare waren zu erst da!
125 \end{frame}
126
127 \section{Pipe}
128 \begin{frame}[fragile]
129 \frametitle{Auf der Leitung stehen}
130 \framesubtitle{Was ist eine Pipe?}
131 \begin{itemize}
132 \item{Die Ausgabe eines Befehls an einen anderen weiter geben}
133 \pause
134 \item{\Huge{\textpipe}}
135 \end{itemize}
136 \pause
137 \begin{verbatim}
138 fortune | cowsay
139 \end{verbatim}
140 \end{frame}
141
142 \section{Kisten packen}
143
144 \begin{frame}[fragile]
145 \frametitle{Das Kurz-Zeit-Gedächnis}
146 \framesubtitle{Kisten, für alles und nicht's}
147 \large{Was sind Variablen?}
148 \normalsize{
149 \begin{itemize}
150 \item{denk dir ein Wort oder Buchstaben aus, der kein Shell-Befehl ist}
151 \pause
152 \item{weise diesem Wort oder Buchstaben etwas zu}
153 \pause
154 \item{Es muss kein Datentyp deklariert werden}
155 \end{itemize}
156 \pause
157 \begin{verbatim}
158 var=10
159 Name=HeyDu
160 cmd=$(figlet -tf block Immer diese Menschen)
161 \end{verbatim}
162 \pause
163 Das ganze wird mit
164 \begin{verbatim}
165 $Variabelnname
166 \end{verbatim}
167 benutzt.}
168 \end{frame}
169
170 \begin{frame}[fragile]
171 \frametitle{Das Kurz-Zeit-Gedächnis}
172 \framesubtitle{Kisten, für alles und nicht's}
173
174 \large{Was sind Arrays?}\\
175 \normalsize{
176 eine Box für mehrere Werte, mit indexiertem Inhaltsverzeichnis
177 \pause
178 \begin{verbatim}
179 declare -a wort
180 wort=(hier steht irgendwas drin)
181 echo $wort
182 #mit index
183 echo ${wort[2]}
184 #gesamtes Array
185 echo ${wort[*]}
186 echo ${wort[@]}
187 \end{verbatim}
188 \pause
189 \small{
190 hint: Der Unterschied zwischen * und @ ist das newline beim @ (wird beim looping fliegen relevant)
191 }
192 }
193 \end{frame}
194
195 \section{Zwischen-Prüfung}
196
197 \begin{frame}[fragile]
198 \frametitle{Das Leben besteht aus Prüfungen}
199 \framesubtitle{diese verdammt Logik und ihre Tests}
200 \large{Wofür macht man Tests?}
201 \pause
202 \normalsize{
203 \begin{itemize}
204 \item{ich will wissen, ob etwas richtig ist}
205 \item{ich will abhänig vom Wert einer Variable etwas tun}
206 \item{ich will etwas nicht tun wenn...}
207 \end{itemize}
208 \pause
209 \begin{verbatim}
210 var=11
211 test $var == "10"
212 echo $?
213 \end{verbatim}
214 \pause
215 \begin{description}
216 \item[var=11] setz die Variable var auf 11
217 \item[test \$var == ''10''] prüf mal ob in der Variable 10 steht
218 \item[echo \$?] was ist das ergebnis des letzten Befehls?
219 \end{description}
220 }
221 \end{frame}
222
223 \section{Logisch}
224
225 \begin{frame}[fragile]
226 \frametitle{Das Leben besteht aus Prüfungen}
227 \framesubtitle{diese verdammt Logik und ihre Tests}
228 \large{Logik}
229 \pause
230 \normalsize{
231 \begin{description}
232 \item[UND] Prüfen ob alles Tests wahr sind
233 \begin{verbatim}
234 i="Du"
235 j="Hallo"
236 test $i == "Du" && \
237 test $j == "Hallo"
238 echo $?
239 \end{verbatim}
240 \pause
241 \item[ODER] Prüfen, ob ein Test von mehreren wahr ist
242 \begin{verbatim}
243 i="Name"
244 j="Hallo"
245 test $i == "1x" ||\
246 test $j == "Hallo"
247 echo $?
248 \end{verbatim}
249 \pause
250 \item[nicht] Prüfen, ob ein Test falsch ist
251 \begin{verbatim}
252 i="Falsch ist falsch"
253 test $i != "richtig"
254 echo $?
255 \end{verbatim}
256 \end{description}
257 \pause
258 Das ganz kann belibig verknüpft werden - Also viel Spaß
259 }
260 \end{frame}
261
262 \section{Wenn...}
263 \begin{frame}[fragile]
264 \frametitle{Wenn Du nicht sofort tust was ich sage, Dann ...}
265 \framesubtitle{Verzweigungen}
266 \large{if}\\
267 \normalsize{
268 Wenn, prüfe ob das wahr ist, dann...
269 \pause
270 \begin{verbatim}
271 if test $var == "10"; then figlet "Das\
272 ist wahr"; fi
273
274 if [[ $var == "10" ]] ; then echo "Das\
275 ist echt wahr"; figlet "knapp vorbei \
276 ist auch daneben";fi
277 \end{verbatim}
278 \pause
279 \begin{description}
280 \item[= vs ==] ist egal, solange darum leerzeichen verwendet werden
281 \pause
282 \item[else] muss nicht unbedingt verwendet werden
283 \pause
284 \item[mehrfach] verschachtelungen gehen auch
285 \end{description}
286 \large ifelse [[Bedingung]]
287 }
288 \end{frame}
289
290 \section{Wenn...}
291
292 \begin{frame}[fragile]
293 \frametitle{Wenn Du nicht sofort tust was ich sage, Dann ...}
294 \framesubtitle{Verzweigungen}
295 Wenn die Verschachtelungen unübersichtlich werden:
296 \begin{verbatim}
297 case $var in
298 10)
299 cowsay -f tux "ich hab 10 gefunden"
300 ;;
301 11)
302 cowsay -f tutle "ich hab 11 gefunden"
303 ;;
304 *)
305 cowsay -f ghostbusters "ich hab irgendwas\
306 gefunden"
307 ;;
308 esac
309 \end{verbatim}
310 \end{frame}
311
312 \section{Rechenmeister}
313
314 \begin{frame}[fragile]
315 \frametitle{Mathe und bash}
316 \framesubtitle{Rechnen in der Shell}
317 einfach auf der shell loslegen is zu einfach
318 \pause
319 \begin{verbatim}
320 x=$(expr $var * $var)
321 \end{verbatim}
322 Weise der Variable x das Ergebnis der Berechnung aus var mal var zu.
323 \end{frame}
324
325 \section{Test}
326
327 \begin{frame}
328 \frametitle{die Prüfung beginnt}
329 \framesubtitle{das erste Script}
330 ...and action in a shell
331 \pause
332 \begin{description}
333 \item[cut] zerschneide etwas (-d) am Zeichen (-f) speichere Feld
334 \item[echo] gib etwas aus (-e) erkenne Escape-Sequenzen
335 \item[date] gib das Datum aus (+\%) Format
336 \end{description}
337 \end{frame}
338
339
340 \section{Loopings}
341
342 \begin{frame}[fragile]
343 \frametitle{Schleifen binden und durch loopings fliegen}
344 \framesubtitle{while}
345
346 \large{solage etwas stimmt}\\
347 \normalsize{
348 mach etwas
349
350 \begin{verbatim}
351 while [[ $var -eq "10" ]]
352 do
353 fortune
354 done
355 \end{verbatim}
356 }
357 \end{frame}
358
359 \begin{frame}[fragile]
360 \frametitle{Schleifen binden und durch loopings fliegen}
361 \framesubtitle{until}
362
363 \large{bis etwas stimmt}\\
364 \normalsize{
365 die Bedingung wird erst nach der ersten rund ein der Schliefe geprüft\\
366 mach etwas
367 \begin{verbatim}
368 i=0
369
370 until [[ $i -eq 10 ]]
371 do
372 ((i++))
373 whereis brain?
374 done
375 \end{verbatim}
376 }
377 \end{frame}
378
379
380 \begin{frame}[fragile]
381 \frametitle{Schleifen binden und durch loopings fliegen}
382 \framesubtitle{for}
383
384 \large{bis etwas die Zahl n erreicht hat} \\
385 \normalsize{
386 mach etwas\\
387 wird häufig für Arrays benutzt\\
388 \pause
389 dafür sind Inkrement (hoch zählen um 1) ((i++))\\
390 und Dekrement (runter zählen um 1) ((i- -))\\
391 hilfreich.
392 \pause
393 \begin{verbatim}
394 declare -a blubb
395
396 j=0
397 blubb=(aber nun reicht es mir)
398 for $i in ${blubb[@]}
399 do
400 ((j++))
401 echo $i $j
402 done
403 \end{verbatim}
404 }
405 \end{frame}
406
407 \section{Wenn Programmierer diskutieren}
408 \begin{frame}[fragile,shrink]
409 \frametitle{f(x)}
410 \framesubtitle{Funktionen}
411 \large{Teile und Herscher}
412 \newline
413 \normalsize{mit Funktionen können Code-Wiederholungen vermieden werden.}
414 \pause
415 \scriptsize{
416 \begin{verbatim}
417 #/bin/bash
418 datumsfrage()
419 {
420 read -p "Welches Datum haben wir?" datVari
421 if [[ $datVari -eq date ]]
422 then
423 figlet "stimmt"
424 else
425 echo "nee, stimmt nicht - nochmal"
426 datumsfrage()
427 fi
428 }
429
430 echo "ich frag mal nach dem Datum"
431 datumsfrage()
432 \end{verbatim}
433 }
434 \end{frame}
435
436
437 \section{Advent Advent}
438 \begin{frame}
439 \frametitle{die zweite Prüfung}
440 \framesubtitle{noch ein Script}
441 ...and action in a shell\\
442 \pause
443 \begin{description}
444 \item[sleep] bitte mal für \$n Sekunden einschlafen
445 \item[read] frag mal den User (-p) die Frage (variabelnname) (-e) mit bash-complition
446 \item[RANDOM] für die Zufallsberechnung (\%) bis
447 \item[exit] breche hier mal und gib mir meine Shell zurück
448 \end{description}
449 \end{frame}
450
451
452 \section{Rezepte erstellen}
453 \begin{frame}[fragile]
454 \frametitle{Schreibe ein Rezept}
455 \framesubtitle{Not to Do}
456
457 \large{Befehle zusammenpacken}
458 \normalsize{
459 \pause
460 \begin{itemize}
461 \item{Nimm den deinen lieblings-Texteditor}
462 \pause
463 \item{schreib deine Befehle in der Reihenfolge auf in der sie ausgeführt werden sollen}
464 \pause
465 \item{vergiss die Einrückungen von Code-Zeilen - das ist nur was für DAUs}
466 \pause
467 \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)}
468 \pause
469 \item{teste auf keinen Fall, ob es funktioniert}
470 \pause
471 \item{ausführen und Spaß haben}
472 \end{itemize}
473
474 \pause
475 \begin{verbatim}
476 ./name #sourcen ! es müssen Aufführrechte
477 #gesetzt sein
478 bash name #bash führ das mal aus
479 \end{verbatim}
480 }
481 \end{frame}
482
483
484 \begin{frame}[fragile]
485 \frametitle{bang!bang!bang!}
486 \framesubtitle{Was macht das shebang?}
487 \large{keinem die Script-sprache verraten}
488 \newline
489 \normalsize{
490 \pause
491 \begin{itemize}
492 \item{Das shebang ist wichtig, wenn Irrtümer vermieden werden sollen}
493 \item{Das Script nicht unbedingt mit der Scriptsprache vorne weg gestartet wird}
494 \end{itemize}
495 \pause
496 Wie sieht das aus?
497 \begin{verbatim}
498 #!/bin/bash
499 \end{verbatim}
500 }
501 \end{frame}
502
503 \section{The End of Talk}
504
505 \begin{frame}
506 \frametitle{Tipps und Tricks}
507 \begin{description}
508 \item[script] zeichnet auf, was in der shell passiert (inklusive der Typos)
509 \item[scriptreplay] spielt wieder ab, was ihr auf gezeichnet habt, wenn ihr vorher eine timing-datei angelegt habt, dann in Echtzeit
510 \item[bash -x] hilfreich fürs debugging von Scripten, weil es anzeigt, wie die Variabeln aufgelöst werden
511 \end{description}
512
513 \pause
514 Bitte vergesst nicht Fehler einzubauen, das hat den Größten Lerneffekt
515 \end{frame}
516
517
518 \begin{frame}
519 \frametitle{Ende}
520 \large{Vielen Dank fürs zuhören! \\ Habt ihr noch Fragen?}\hfill \break
521 \normalsize{
522 \colorbox{blue}{\textcolor{white}{Susanne (Bücherratten)}} \\
523 \colorbox{blue}{\textcolor{white}{ratten@buecherratten.in-berlin.de}} \\
524 \colorbox{blue}{\textcolor{white}{friendica:buecherratte@snarl.de}} \\
525 \colorbox{blue}{\textcolor{white}{gpg:fingerprint:}} \\
526 \colorbox{blue}{\textcolor{white}{0E42 3FA3 838E E7ED 5AA2}} \\
527 \colorbox{blue}{\textcolor{white}{20E7 ACA3 EA4A C038 CCFD}} \\
528 }
529 \end{frame}
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746 \end{document}
747
benutzt werden, wie sie auch in der folgenden Liste der Dateien erscheint. Es sollte
die URL des Verweises ("laden") kopiert werden, da sich diese jederzeit ändern kann und damit der Verweis auf die Datei brechen würde.