First Working Version of Workshop
authorratten <ratten@buecherratten.in-berlin.de>
Sun, 22 Dec 2024 18:18:20 +0000 (19:18 +0100)
committerratten <ratten@buecherratten.in-berlin.de>
Sun, 22 Dec 2024 18:18:20 +0000 (19:18 +0100)
.gitignore [new file with mode: 0644]
Anleitung.pdf [new file with mode: 0644]
Anleitung.tex [new file with mode: 0644]
Bilder/bash-on-fire.png [new file with mode: 0644]
cheatsheet.pdf [new file with mode: 0644]
cheatsheet.tex [new file with mode: 0644]
haecksen-skript.sh [new file with mode: 0644]
my-way-to-shell.pdf [new file with mode: 0644]
my-way-to-shell.tex [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..681d622
--- /dev/null
@@ -0,0 +1,354 @@
+# ---> TeX
+## Core latex/pdflatex auxiliary files:
+*.aux
+*.lof
+*.log
+*.lot
+*.fls
+*.out
+*.toc
+*.fmt
+*.fot
+*.cb
+*.cb2
+.*.lb
+
+## Intermediate documents:
+*.dvi
+*.xdv
+*-converted-to.*
+# these rules might exclude image files for figures etc.
+# *.ps
+# *.eps
+# *.pdf
+
+## Generated if empty string is given at "Please type another file name for output:"
+.pdf
+
+## Bibliography auxiliary files (bibtex/biblatex/biber):
+*.bbl
+*.bcf
+*.blg
+*-blx.aux
+*-blx.bib
+*.run.xml
+
+## Build tool auxiliary files:
+*.fdb_latexmk
+*.synctex
+*.synctex(busy)
+*.synctex.gz
+*.synctex.gz(busy)
+*.pdfsync
+
+## Build tool directories for auxiliary files
+# latexrun
+latex.out/
+
+## Auxiliary and intermediate files from other packages:
+# algorithms
+*.alg
+*.loa
+
+# achemso
+acs-*.bib
+
+# amsthm
+*.thm
+
+# beamer
+*.nav
+*.pre
+*.snm
+*.vrb
+
+# changes
+*.soc
+
+# comment
+*.cut
+
+# cprotect
+*.cpt
+
+# elsarticle (documentclass of Elsevier journals)
+*.spl
+
+# endnotes
+*.ent
+
+# fixme
+*.lox
+
+# feynmf/feynmp
+*.mf
+*.mp
+*.t[1-9]
+*.t[1-9][0-9]
+*.tfm
+
+#(r)(e)ledmac/(r)(e)ledpar
+*.end
+*.?end
+*.[1-9]
+*.[1-9][0-9]
+*.[1-9][0-9][0-9]
+*.[1-9]R
+*.[1-9][0-9]R
+*.[1-9][0-9][0-9]R
+*.eledsec[1-9]
+*.eledsec[1-9]R
+*.eledsec[1-9][0-9]
+*.eledsec[1-9][0-9]R
+*.eledsec[1-9][0-9][0-9]
+*.eledsec[1-9][0-9][0-9]R
+
+# glossaries
+*.acn
+*.acr
+*.glg
+*.glo
+*.gls
+*.glsdefs
+*.lzo
+*.lzs
+*.slg
+*.slo
+*.sls
+
+# uncomment this for glossaries-extra (will ignore makeindex's style files!)
+# *.ist
+
+# gnuplot
+*.gnuplot
+*.table
+
+# gnuplottex
+*-gnuplottex-*
+
+# gregoriotex
+*.gaux
+*.glog
+*.gtex
+
+# htlatex
+*.4ct
+*.4tc
+*.idv
+*.lg
+*.trc
+*.xref
+
+# hyperref
+*.brf
+
+# knitr
+*-concordance.tex
+# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files
+# *.tikz
+*-tikzDictionary
+
+# listings
+*.lol
+
+# luatexja-ruby
+*.ltjruby
+
+# makeidx
+*.idx
+*.ilg
+*.ind
+
+# minitoc
+*.maf
+*.mlf
+*.mlt
+*.mtc[0-9]*
+*.slf[0-9]*
+*.slt[0-9]*
+*.stc[0-9]*
+
+# minted
+_minted*
+*.pyg
+
+# morewrites
+*.mw
+
+# newpax
+*.newpax
+
+# nomencl
+*.nlg
+*.nlo
+*.nls
+
+# pax
+*.pax
+
+# pdfpcnotes
+*.pdfpc
+
+# sagetex
+*.sagetex.sage
+*.sagetex.py
+*.sagetex.scmd
+
+# scrwfile
+*.wrt
+
+# svg
+svg-inkscape/
+
+# sympy
+*.sout
+*.sympy
+sympy-plots-for-*.tex/
+
+# pdfcomment
+*.upa
+*.upb
+
+# pythontex
+*.pytxcode
+pythontex-files-*/
+
+# tcolorbox
+*.listing
+
+# thmtools
+*.loe
+
+# TikZ & PGF
+*.dpth
+*.md5
+*.auxlock
+
+# titletoc
+*.ptc
+
+# todonotes
+*.tdo
+
+# vhistory
+*.hst
+*.ver
+
+# easy-todo
+*.lod
+
+# xcolor
+*.xcp
+
+# xmpincl
+*.xmpi
+
+# xindy
+*.xdy
+
+# xypic precompiled matrices and outlines
+*.xyc
+*.xyd
+
+# endfloat
+*.ttt
+*.fff
+
+# Latexian
+TSWLatexianTemp*
+
+## Editors:
+# WinEdt
+*.bak
+*.sav
+
+# Texpad
+.texpadtmp
+
+# LyX
+*.lyx~
+
+# Kile
+*.backup
+
+# gummi
+.*.swp
+
+# KBibTeX
+*~[0-9]*
+
+# TeXnicCenter
+*.tps
+
+# auto folder when using emacs and auctex
+./auto/*
+*.el
+
+# expex forward references with \gathertags
+*-tags.tex
+
+# standalone packages
+*.sta
+
+# Makeindex log files
+*.lpz
+
+# xwatermark package
+*.xwm
+
+# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib
+# option is specified. Footnotes are the stored in a file with suffix Notes.bib.
+# Uncomment the next line to have this generated file ignored.
+#*Notes.bib
+
+# ---> Emacs
+# -*- mode: gitignore; -*-
+*~
+\#*\#
+/.emacs.desktop
+/.emacs.desktop.lock
+*.elc
+auto-save-list
+tramp
+.\#*
+
+# Org-mode
+.org-id-locations
+*_archive
+
+# flymake-mode
+*_flymake.*
+
+# eshell files
+/eshell/history
+/eshell/lastdir
+
+# elpa packages
+/elpa/
+
+# reftex files
+*.rel
+
+# AUCTeX auto folder
+/auto/
+
+# cask packages
+.cask/
+dist/
+
+# Flycheck
+flycheck_*.el
+
+# server auth directory
+/server/
+
+# projectiles files
+.projectile
+
+# directory configuration
+.dir-locals.el
+
+# network security
+/network-security.data
+
+
diff --git a/Anleitung.pdf b/Anleitung.pdf
new file mode 100644 (file)
index 0000000..075fc73
Binary files /dev/null and b/Anleitung.pdf differ
diff --git a/Anleitung.tex b/Anleitung.tex
new file mode 100644 (file)
index 0000000..e50f62b
--- /dev/null
@@ -0,0 +1,446 @@
+\documentclass[graphicx,parskip]{scrartcl}
+
+\usepackage{xcolor}
+\usepackage[ngerman]{babel}
+\usepackage[utf8]{inputenc}
+
+\usepackage{hyperref}
+
+\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}  
+
+\usepackage{lineno}
+\usepackage[newfloat]{minted}
+\usemintedstyle{friendly}
+\usemintedstyle[sourcelist,linux-config]{autumn}
+\usemintedstyle[console]{staroffice}
+\usemintedstyle[bash]{pastie}
+
+\setminted[bash]{
+  breaklines=true,
+  tabsize=2,
+  numbersep=2pt,
+  autogobble,
+  framesep=0pt,
+  linenos
+}
+
+ \setminted[linux-config]{
+   breaklines=true,
+   linenos,
+   numbersep=2pt,
+   autogobble,
+   framesep=0pt
+ }
+  
+ \setminted[console]{
+   breaklines=true,
+   linenos,
+   numbersep=2pt,
+   autogobble,
+   framesep=0pt
+ }
+
+\title{A Way to (S)Hell}
+\subtitle{Anleitung zum lernen}
+ \author{Bücherratten\\
+   \multicolumn{1}{p{.7\textwidth}}{\centering\emph{38c3 Haecksen}}}
+
+\date{30. Dezember 2024}
+\begin{document}
+
+\maketitle
+
+\section{Shell lernen}
+Die bash-Shell kann an besten durch Benutzung gelernt werden, in dem so viele Dinge wie möglich im Terminal gemacht werden.\\
+Folgende Alternativen lassen sich in der Shell nutzen
+\begin{description}
+\item[mail] neomutt / mutt
+\item[broweser] lynxs
+\item[dateimanager] cd, ls /ranger
+\item[bildbetrachter] feh, imv
+\item[aufgabenliste] taskwarrior
+\item[calender] calcurse, cal
+\end{description}
+Die Liste ist als Anregung gedacht und hat keinen Anspruch auf Vollständigkeit, bitte um weitere Tools ergänzen
+
+\section{Was braucht es zum Programmieren?}
+
+\begin{itemize}
+\item{mehrere Befehle, die auf mal ausgeführt werden sollen (ein Idee)}
+\item{Texteditor (zBsp vim, emacs, nano, geany, gedit, kate, Leafpad, Mousepad...)}
+\item{Kreativität}
+\end{itemize}
+
+Egal um welche Programmiersprache es sich handelt, es gibt ein paar Basics, die gute Skripte ausmachen.
+
+\begin{itemize}
+\item{Zeilenumbrüche}
+  Bis auf sehr wenige Programmiersprachen, sind Zeilenumbrüche nicht unbedingt notwendig. Aber je mehr in einer Zeile als Anweisung geschrieben steht, desdo schwerer fällt es in der Regel das Skipt/Programm zu lesen und nachzuvollziehen, was es tut. Daher macht Zeilenumbrüche immer spätestens dann wenn das Zeilenende erreicht ist und ihr ein Symbol für das Zeilenende (oft ;) eingeben müsst.
+\item{Variablenamen/Funktionsnamen}
+  Es ist für dein zukünftiges Ich, wichtig die Variablenname nach Möglichkeit so auszuwählen, dass sofort klar wird was drin ist oder vofür sie verwendet werden. Man sagt auch es sollten sprechende Variablen verwendet werden.
+  Der Name \textbf{\texttt{Meine\_Variable1}} ist in keiner Weise hilfreich, auch die Benennung nach Sternen, Städtenamen, Flüssen oder Tieren mag von Kreativität zeugen, hilft aber nicht zu einem späteren Zeitpunkt das Skript zu verstehen.
+\item{Kommentare}
+  Kommentare können den Code erklären und sind vorallem dann zu verwenden wenn man für die Lösung nachschlagen musste. Gerade in der Anfangszeit kann nicht zuviel kommentiert werden, daher auch durch aus deine Gedanken, warum man etwas so oder so löst mit aufschreiben, das erleichtert deinem zukünftigem Selbst, den von dir geschriebenen Code nachzuvollziehen.
+\end{itemize}
+
+Alle machen beim Programmieren Fehler, das gehört dazu. Fehler sind keine Feinde, sondern Freunde, die dir helfen, anders über Dinge nachzudenken und die Perspektive zu wechseln. An ihnen kannst du lernen, besseren Code und bessere Skripte sowie Programme zu schreiben. Nutze daher deine Fehler als Chance, dich zu verbessern.
+
+\section{Bash}
+
+\subsection{shebang}
+
+Da du nicht wissen kannst ob dein zukünftiges Ich noch mit der bash dein Skript aufruft oder wie das ist, wenn dein Skript von jemand anderes genutzt wird, ist es sinnvoll als erstes ein shebang zu schreiben
+\begin{minted}{bash}
+  #!/bin/bash
+\end{minted}
+Dabei achte darauf ob der Pfad stimmt. In der Regel ist der Pfad bei den gängigen Linux Distros unter /bin aber das gilt nicht für alle Distros.
+\begin{minted}{bash}
+  whereis bash
+\end{minted}
+
+\subsection{Variablen}
+
+In Variablen kannst du Dinge reinstecken, das können die Ergebnisse von Befehlen oder Werte(zBsp Zahlen) als auch Text sein. Du entscheidest was du da reinsteckst. Eine Variable kann eine beliebige Anzahl an Zeichen sein. Am besten überlegst du dir einen sprechenden Namen für deine Variable.
+
+\begin{minted}{bash}
+  irgendeineZahl=5
+  ausgebeText="Hallo Welt"
+  heutiges_Datum=$(date)
+\end{minted}
+
+Wichtig es darf um das = kein Leerzeichen stehen, weil die bash ein = mit Leerzeichen als Vergleich wertet!!\\
+Oft werden in bash-Skripten oder auch anderen Programmiersprachen relativ weit oben im Skript die wichtigsten Variablen deklariert (schon mal leer belegt). Diese Variablen sind gobale Variablen, was dedeutet, dass sie auch innerhalb von Funktionen genutzt werden können und dort mit Werten belegt werden können, die auch in anderen Funktionen genutzt werden können und über all im Skript verwendbar sind. Variablen können jederzeit überall im Skript einfach zugewiesen werden.\\
+Variablen, die nur innerhalb von Funktionen genutzt werden, sind ausserhalb der Funktionen nicht mit dem Wert der ihnen innerhalb der Funktion gegeben wurde nutzbar..
+
+\subsection{Funktionen}
+
+Funktionen sind Programm-Blöcke die zusammengefasst werden und über einen Funktionsnamen aufgerufen werden. Dadurch kann das Skript strukturiert werden, es können Entscheidungen getroffen werden, wann welche Funktionen des Skriptes genutzt werden. Auch hier ist es gut für die Lesbarkeit des Skriptes möglichst sprechende Funktionsnamen zu vergeben.\\
+
+Es gibt 2 Methoden, Funktionen zu erstellen:
+\begin{minted}{bash}
+  function meine_erste_Funktion()
+  {
+    echo "Hallo aus der Funktion: meine_erste_Funktion"
+  }
+  meine_erste_Funktion
+\end{minted}
+
+\begin{minted}{bash}
+  meine_zweite_Funktion()
+  {
+    echo "Hallo aus der Funktion: meine_zweite_Funktion"
+  }
+  meine_zweite_Funktion
+\end{minted}
+Mit Funktionen kann noch mehr als nur das Struktuieren von Skripten erreicht werden, aber das ist für Fortgeschrittene.
+\subsection{Ein\-Ausgabe}
+
+Um Text in der bash auszugeben wird der Befehl \mint{bash}{echo} verwendet. Es gibt bei den Anführungszeichen bedeutende Unterschiede. Wenn der Text nach dem echo von \mint{bash}{"} eingeschlossen wird, werden Variablen die innerhalb des Textes stehen aufgelöst:
+\begin{minted}{console}
+  echo "Grußformel $ausgabeText"
+  Grußformel Hallo Welt
+\end{minted}
+Wenn der Text jedoch in einfachen ' steht, wird er so ausgegeben wie er geschrieben wurde:
+\begin{minted}{console}
+  echo 'Grußformel $ausgabeText'
+  Grußformel $ausgabeText
+\end{minted}
+
+Natürlich kann auch der Nutzer des Skriptes nach bestimmten Dingen gefragt werden und Sachen eingeben, die dann wiederum den weiteren Verlauf des Skriptes bestimmen können. Dafür wird der Befehl \mint{bash}{read} genutzt. Die manpage zu dem read-Befehl ist nicht so leicht zu finden: \mint{bash}{man bash} unter SHELL BUILTIN COMMANDS und dort unter read.\\
+
+Mit dem Befehl kann mehr angestellt werden, als nur eine NutzerEingabe abzufangen, aber hier beschränken wir uns auf die NutzerEingabe.\\
+
+Die Nutzeraufrage kann auf zwei Arten geschen:
+\begin{minted}{console}
+  read Eingabe
+  echo $Eingabe
+\end{minted}
+\begin{minted}{console}
+  read -p "Bitte etwas eingeben: " Eingabe
+  echo $Eingabe
+\end{minted}
+
+\subsection{Logik}
+
+Die Logik ist in der Computerei sehr wichtig und meiner Meinung nach verbessert sich die Logik, je mehr Skripte geschrieben werden. Es geht dabei immer darum, ob etwas wahr (in der bash 0) oder falsch (in der bash ein anderer Wert als 0) ist. Es wird also etwas getestet. Dafür gibt es den Befehl \mint{bash}{test}.
+
+Allerdings wird mensch kaum auf Skripte in freier Wildbahn treffen, die diesen Befehl tatsächlich verwenden. Meistens wird die Abkürzung [ ] oder [[ ]] verwendet. Innerhalb der Klammern steht der zu testende Ausdruck.
+
+\begin{minted}{bash}
+# Teste ob die Variable kleiner als 5 ist
+  test $EineWeitereVariable -le 5
+  echo $?
+  
+# Teste ob die Variable kleiner als 10 ist
+  test $EineWeitereVariable -le 10
+  echo $?
+  
+\end{minted}
+
+\mint{bash}{$?} gibt den Status/Rückgabewert des letzten Befehls zurück, dieser ist 0 wenn alles funktioniert hat, was auch wahr bedeutet in der bash.\\
+
+Natürlich können test auch miteinander verknüpft werden. Zum Beispiel mit einem Logischen UND. Das prüft, ob der erste Test erfolgreich \textbf{UND} der weitere Test erfolgreich war. Wenn beide Tests erfolgreich oder wahr sind: ist der gesamte Test wahr.\\
+Dabei gibt es unterschiedliche Möglichkeiten, das in bash zu beschreiben:
+\begin{minted}{bash}
+# Teste ob die Variable größer als 5 ist UND ob die Variable kleiner als 10 ist
+  test $EineWeitereVariable -gt 5 -a $EineWeitereVariable -le 10
+  echo $?
+  test $EineWeitereVariable -gt 5 && test $EineWeitereVariable -le 10
+  echo $?
+  [[ $EineWeitereVariable -gt 5 ]] && [[ $EineWeitereVariable -le 10 ]]
+  echo $?     
+\end{minted}
+
+Wenn ein Test falsch sein darf, aber nicht beide, wird mit einem Logischem ODER verküpft. Dabei handelt es sich nicht um ein ausschließendes ODER.
+
+\begin{minted}{bash}
+# Teste ob die Variable größer als 5 ist ODER ob die Variable kleiner als 10 ist
+test $EineWeitereVariable -gt 5 -o $EineWeitereVariable -le 10                                                   
+echo $?                                                                                                              
+test $EineWeitereVariable -gt 5 || test $EineWeitereVariable -le 10                                                  
+echo $?                                                                                                              
+[[ $EineWeitereVariable -gt 5 ]] || [[ $EineWeitereVariable -le 10 ]]                                                
+echo $? 
+\end{minted}
+Logische Operatoren können beliebig oft mit einander verküpft werden.
+
+\subsection{Verzweigungen}
+Diese Logik wird genutzt für Abzweigungen im Programm/ bzw Skript. Wir kennen das aus Wenn-Dann-Sätzen in unserer Sprache. Wenn eine Bedingung zutrifft machen wir etwas.\\
+Also wenn es regnet, dann spannen wir den Regenschirm auf.
+\begin{minted}{bash}
+ if [[ $Event = "C" ]]                                                                                                
+ then                                                                                                                 
+     echo "Du hast den ChaosCommunicationCongress gewählt"                                                            
+ fi                                                                                                                   
+
+ if [[ $Event = "E" ]]                                                                                                
+ then                                                                                                                 
+     echo "Du hast den Easterhegg gewählt"                                                                            
+ fi                                                                                                                   
+\end{minted}
+
+Manchmal will man auch noch den Fall abklären was zu tun ist, wenn es regnet oder nicht regnet.\\
+Also wenn es regent, dann spannen wir den Regenschirm auf, sonst freuen wir uns das es nicht regnet.
+\begin{minted}{bash}
+ if [[ $Event = "Congress" ]]                                                                                         
+ then                                                                                                                 
+     echo "Du hast den ChaosCommunicationCongress gewählt"                                                            
+     Event="C"                                                                                                        
+ else                                                                                                                 
+     echo "Du hast den Easterhegg gewählt"                                                                            
+     Event="E"                                                                                                        
+ fi                                                                                                                   
+\end{minted}
+Manchmal gibt es aber auch mehr als zwei Verzweigungen:\\
+Wenn es regent, dann spannen wir den Regenschirm auf, falls die Sonne scheint, nutzen wir Sonnencreme, sonst freuen wir uns das es nicht regnet.
+\begin{minted}{bash}
+if [[ $Event = "Congress" ]]                                                                                         
+then                                                                                                                 
+    echo "Du hast den ChaosCommunicationCongress gewählt"                                                            
+    Event="C"                                                                                                        
+
+elif [[ $Event = "Easterhegg" ]]                                                                                     
+then                                                                                                                 
+    echo "Du hast den Easterhegg gewählt"                                                                            
+    Event="E"                                                                                                        
+else                                                                                                                 
+    echo "Eingabe konnte die Verifiziert werden"                                                                     
+fi                   
+\end{minted}
+
+\subsection{Arrays}
+
+Arrays kann man sich als eine Box voll mit Variablen vorstellen. Die Variablen darin sind sortiert und werden über eine Nummerierung angesprochen. Dabei wird in der bash bei 0 angefangen zu zählen. Der erste Wert in einem Array steht also an der Position 0. Das ist auch oft in anderen Programmiersprachen der Fall aber nicht immer.\\
+Welche Werte ihr in eure Box packt und ob es sich um Zahlen, Text oder Befehlsergebnisse handelt, ist euch überlassen, auch eine Mischung aus allem ist möglich. Es gibt auch mehrdimensionale Arrays, in der bash jedoch nicht. Das Thema ist für Fortgeschrittene.
+\begin{minted}{bash}
+# Array initialisierung
+Box=(1 pinguin 2 3)
+  
+echo ${Box[1]}
+echo ${Box[0]}
+# mit newline
+echo ${Box[@]}
+
+# ohne newline
+echo ${Box[*]}
+
+echo "füge den Array was hinzu"
+Box+=(4)
+echo ${Box[@]}
+
+\end{minted}
+
+Wir werden in unserem Skript keine Arrays brauchen...
+
+\subsection{Schleifen}
+Es kann durchaus sinnvoll sein, etwas solange zu wiederholen, bis ein bestimmtes Ergebnis eingetretten ist. Dieses Konstrukt wird Schleife genannt.
+Diese sind nach folgendem Muster aufgebaut:\\
+Schleifen-Kopf, hier steht die zu erfüllende Bedinung\\
+Schleifen-Körper, hier stehen die Anweisungen die wiederholt werden sollen, bis die Bedinung erfüllt ist.
+
+Es gibt 3 Formen von Schleifen:\\
+
+\subsubsection{\textbf{\texttt{while}}}
+Bei einer While-Schleife wird solange etwas getan, \textbf{wie die Bedingung erfüllt ist}, das bedeutet das zuerst die Bedinung geprüft wird, ist diese wahr, werden die Anweisungen im Schleifen-Körper ausgeführt, wenn nicht wird der Schleifen-Körper komplett übersprungen.
+  
+\begin{minted}{bash}
+  while [[ -z $Event ]]
+  # Solange die Länge der Variable Event null ist
+  do
+    # Antwort auf die Frage mit Ausgabe-promt in Variable Event schreiben
+    read -p "Möchtest du die verbleibenden Tage zum nächsten Congress oder Easterhegg wissen? (C)ongress\(E)asterhegg " Event
+
+    # prüfe ob in der Variable Congress oder C steht
+    if [[ $Event = "Congress" ]] || [[ $Event = "C" ]]
+    then
+      echo "Du hast den ChaosCommunicationCongress gewählt"
+      Event="C"
+    elif [[ $Event = "Easterhegg" ]] || [[ $Event = "E" ]]
+    then
+      echo "Du hast den Easterhegg gewählt"
+      Event="E"
+   else
+     echo "Eingabe konnte die Verifiziert werden"
+     Event=""
+   fi
+done
+\end{minted}
+
+\subsubsection{\textbf{\texttt{until}}}
+Bei einer Until-Schleife wird solange etwas getan, \textbf{wie die Bedinung nicht erfüllt ist}, das bedeutet das zuerst die Bedinung geprüft wird, ist diese nicht wahr werden die Anweisungen im Schleifen-Körper ausgeführt, wenn sie war ist, wird der Schleifen-Körper komplett übersprungen.
+
+\begin{minted}{bash}
+# Solange bis  die Länge der Variable Event nicht null ist
+    until [[ -n $Event ]]
+    do
+       # Antwort auf die Frage mit Ausgabe-promt in Variable Event schreiben
+       read -p "Möchtest du die verbleibenden Tage zum nächsten Congress oder Easterhegg wissen? (C)ongress\(E)asterhegg " Event
+       # prüfe
+       if [[ $Event = "Congress" ]] || [[ $Event = "C" ]]
+       then
+          echo "Du hast den ChaosCommunicationCongress gewählt"
+          Event="C"
+       elif [[ $Event = "Easterhegg" ]] || [[ $Event = "E" ]]
+       then
+          echo "Du hast den Easterhegg gewählt"
+          Event="E"
+      else
+          echo "Eingabe konnte die Verifiziert werden"
+          Event=""
+      fi
+   done
+\end{minted}
+
+Aus einer Schleife kann immer auch ausgebrochen werden mit dem Befehl \mint{bash}{break}
+
+\subsubsection{\textbf{\texttt{for}}}
+Eine for-Schleife wird verwendet, um durch ein Array oder eine Form von Liste zu gehen und bei jedem Element etwas zu machen. Wir werden hier aber nicht ausführlich drauf eingehen.
+\begin{minted}{bash}
+  liste=(1 2 3 4)
+  for i in $liste
+  do
+    if [[ $i == 1 ]]
+    then
+       sl
+    elif [[ $i == 2 ]]
+    then   
+      fourtune
+    elif [[ $i == 3 ]]
+    then
+      fortune | cowsay | lolcat
+    else
+      aciiiquarium
+    fi
+  done
+\end{minted}
+
+\subsection{Rechnen}
+
+Es gibt 3 Methoden mit der bash zu rechnen:
+\begin{itemize}
+\item{expr}
+\begin{minted}{bash}
+echo "berechne 2 + 3 Murmeln in der Tasse"
+Tasse=$(expr 2 + 3)
+echo "In der Tasse sind $Tasse Murmeln"
+\end{minted}
+\item{let}
+  \begin{minted}{bash}
+    let Tasse=2*4 ; echo $Tasse "Murmeln"
+  \end{minted}
+\item{bc}
+  \begin{minted}{bash}
+    echo "2*4" | bc
+  \end{minted}
+\end{itemize}
+Wir konzetrieren uns auf expr:
+\begin{minted}{bash}
+# Modulo (Divison mit Rest)
+  a=$(expr $jahr % 19)
+  echo $a
+# geteilt/ Devision  
+  b=$(expr $jahr / 100)
+  echo $b
+# Modulo (Divison mit Rest)  
+  c=$(expr $jahr % 100)
+  echo $c
+# geteilt/Devision  
+  d=$(expr $b / 4)
+  echo $d
+# Modulo (Divison mit Rest)  
+  e=$(expr $b % 4)
+  echo $e
+# variable b + 8, das Ergebnis geteilt durch 25  
+  f=$(expr $(expr $b + 8) / 25)
+  echo $f
+# Variable b minus Variable f + 1, das Ergebnis durch 3
+  g=$(expr $(expr $b - $f + 1) / 3)
+  echo $g
+# 19 mal Variable a + Variable b - variable d - variable g + 15, das Ergebnis Modulo 30
+  h=$(expr $(expr 19 \* $a + $b - $d - $g + 15) % 30 )
+  echo $h
+# Variable c durch 4  
+  i=$(expr $c / 4)
+  echo $i
+# Variable c Modulo 4
+  k=$(expr $c % 4)
+  echo $k
+# ( 32 + 2 mal Variable e + 2 mal Variable i  - Variable h - Variable k ) Modulo 7
+  l=$(expr $(expr 32 + 2 \* $e + 2 \* $i - $h - $k) % 7 )
+  echo $l
+# ( Variable a + 11 mal Variable h + 22 mal Variable l) durch 451
+  m=$(expr $(expr $a + 11 \* $h + 22 \* $l) / 451)
+  echo $m
+# ( Variable h + Variable l - 7 mal Variable m + 144) durch 31   
+  Ostermonat=$(expr $(expr $h + $l - 7 \* $m + 114) / 31)
+  echo $Ostermonat
+# ( Variable h + Variable l - 7 mal Variable m + 144) Modulo 31
+  Ostersonntag=$(expr $(expr $h + $l - 7 \* $m + 114 ) % 31)
+  Ostersonntag=$(expr $Ostersonntag + 1)
+
+echo "Ostersonntag ist am $Ostersonntag'.'$Ostermonat" 
+\end{minted}
+
+Damit können wir nun ein bash Skript das uns die verbleibenden Tage bis zum easterhegg oder Congress verrät.
+  
+\end{document}
+
+
+
+
diff --git a/Bilder/bash-on-fire.png b/Bilder/bash-on-fire.png
new file mode 100644 (file)
index 0000000..0b8ee97
Binary files /dev/null and b/Bilder/bash-on-fire.png differ
diff --git a/cheatsheet.pdf b/cheatsheet.pdf
new file mode 100644 (file)
index 0000000..264e3a0
Binary files /dev/null and b/cheatsheet.pdf differ
diff --git a/cheatsheet.tex b/cheatsheet.tex
new file mode 100644 (file)
index 0000000..20dbf29
--- /dev/null
@@ -0,0 +1,251 @@
+\documentclass[graphicx,parskip]{scrartcl}
+
+\usepackage{xcolor}
+\usepackage[ngerman]{babel}
+\usepackage[utf8]{inputenc}
+
+\usepackage{hyperref}
+
+\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}  
+
+\usepackage{lineno}
+\usepackage[newfloat]{minted}
+\usemintedstyle{friendly}
+\usemintedstyle[sourcelist,linux-config]{autumn}
+
+\setminted[bash]{
+  breaklines=true,
+  tabsize=2,
+  numbersep=2pt,
+  autogobble,
+  framesep=0pt,
+  linenos
+  }
+ \setminted[linux-config]{
+   breaklines=true,
+   linenos,
+   numbersep=2pt,
+   autogobble,
+   framesep=0pt
+ }
+
+ \setminted[console]{
+   breaklines=true,
+   linenos,
+   numbersep=2pt,
+   autogobble,
+   framesep=0pt
+ }
+
+\title{A Way to (S)Hell}
+\subtitle{CheatSheet}
+\author{Bücherratten\\
+ \multicolumn{1}{p{.7\textwidth}}{\centering\emph{38c3 Haecksen}}}
+
+\date{30. Dezember 2024}
+\begin{document}
+
+\maketitle
+
+\section{shebang}
+
+\begin{minted}{bash}
+  #!/bin/bash
+\end{minted}
+
+\subsection{Variabeln}
+
+\begin{minted}{bash}
+Monat=$(date +%m)
+Tage=$(date +%e)
+
+Event=""
+Ostersonntag=""
+Ostermonat=""
+\end{minted}
+
+\section{Funktionen}
+
+\subsection{Ein\-Ausgabe}
+
+\begin{minted}{bash}
+ EventFrage()
+{
+  ### Eingabe/Ausgabe für unser Skript
+  read -p "Zu welchem Event sollen die verbleibenden Tage berechnet werden?(C)ongress\(E)asterhegg " Event
+  echo "Berechne verbleibende Tage zu $Event ..."
+  ### Ende Eingabe/Ausgabe für unser Skript
+  }
+\end{minted}
+
+\subsection{Logik}
+
+\begin{minted}{bash}
+while [[ -z $Event ]]
+do
+    EventFrage   
+
+    # prüfe
+    if [[ $Event = "Congress" ]] || [[ $Event = "C" ]]
+    then
+        echo "Du hast den ChaosCommunicationCongress gewählt"
+        Event="C"
+        break
+
+    elif [[ $Event = "Easterhegg" ]] || [[ $Event = "E" ]]
+    then
+        echo "Du hast den Easterhegg gewählt"
+        Event="E"
+    else
+        echo "Eingabe konnte nicht Verifiziert werden"
+        Event=""
+    fi
+done  
+\end{minted}
+
+\subsection{Rechnen}
+
+\begin{minted}{bash}
+ function Osterberechnung()
+{
+# Modulo (Berechnung mit Rest)
+  a=$(expr $jahr % 19)
+  echo $a
+# geteilt/ Division  
+  b=$(expr $jahr / 100)
+  echo $b
+# Modulo (Berechnung mit Rest)  
+  c=$(expr $jahr % 100)
+  echo $c
+# geteilt/Division  
+  d=$(expr $b / 4)
+  echo $d
+# Modulo (Berechnung mit Rest)  
+  e=$(expr $b % 4)
+  echo $e
+# variable b + 8, das Ergebnis geteilt durch 25  
+  f=$(expr $(expr $b + 8) / 25)
+  echo $f
+# Variable b minus Variable f + 1, das Ergebnis durch 3
+  g=$(expr $(expr $b - $f + 1) / 3)
+  echo $g
+# 19 mal Variable a + Variable b - variable d - variable g + 15, das Ergebnis Modulo 30
+  h=$(expr $(expr 19 \* $a + $b - $d - $g + 15) % 30 )
+  echo $h
+# Variable c durch 4  
+  i=$(expr $c / 4)
+  echo $i
+# Variable c Modulo 4
+  k=$(expr $c % 4)
+  echo $k
+# ( 32 + 2 mal Variable e + 2 mal Variable i  - Variable h - Variable k ) Modulo 7
+  l=$(expr $(expr 32 + 2 \* $e + 2 \* $i - $h - $k) % 7 )
+  echo $l
+# ( Variable a + 11 mal Variable h + 22 mal Variable l) durch 451
+  m=$(expr $(expr $a + 11 \* $h + 22 \* $l) / 451)
+  echo $m
+# ( Variable h + Variable l - 7 mal Variable m + 144) durch 31   
+  Ostermonat=$(expr $(expr $h + $l - 7 \* $m + 114) / 31)
+  echo $Ostermonat
+# ( Variable h + Variable l - 7 mal Variable m + 144) Modulo 31
+  Ostersonntag=$(expr $(expr $h + $l - 7 \* $m + 114 ) % 31)
+  Ostersonntag=$(expr $Ostersonntag + 1)  
+}
+
+\end{minted}
+
+\section{noch fehlende Funktionen}
+\begin{minted}{bash}
+function Easterhegg()
+{
+  Osterberechnung
+  EasterheggStart=$(expr $Ostersonntag - 2)
+  if [[ $Monat == $Ostermonat ]]
+    then
+        if [[ $Tag = $EasterheggStart || $Tag -gt $EasterheggStart && $Tag -lt $(expr $EasterheggStart + 4) ]]
+        then
+            cowsay -f bunny "Willkommen beim Easterhegg"
+        fi
+
+        if [[ $Tag -lt $EasterheggStart ]]
+        then
+            Tage=$(expr $EasterheggStart - $Tag)
+            echo -e $gruen "Es sind noch " $Tage " bis zum Easterhegg "$nc
+        elif [ $Tag -gt $(expr $EasterheggStart +5) ]
+        then
+            echo -e $rot "Leider ist der Easterhegg für diese Jahr schon vorbei :-( " $nc
+        fi
+    fi
+
+    now=$(date --date="today" +%j)
+
+    if [[ $Monat -lt $Ostermonat ]]
+    then
+        easter=$(date --date="$jahr-0$Ostermonat-$EasterheggStart" +%j)
+
+        Tage=$(expr $easter - $now)
+        figlet "Es sind noch " $Tage " bis zum Easterhegg"
+    else
+        easter=$(date --date="$jahr-0$Ostermonat-$EasterheggStart" +%j)
+
+        Tage=$(expr $now + $easter)
+       figlet "Es sind noch " $Tage " bis zum Easterhegg"
+    fi
+}
+
+Congress()
+{
+    if [[ $Monat == 12 && $Tage -ge 27 &&  $Tage -lt 30 ]]
+    then
+        figlet "Happy Congress"
+       figlet -t "It's congress time"
+       echo "make sure to have your ticket available or use the Congress-Everywhere-Stations of Congress"
+       figlet -tf block "Be excellent to each other"
+    elif [[ $Monat == 12 && $Tage = 31 ]]
+    then
+        for i in $(seq $Monat 1 11)
+       do
+            Monatstage=$(expr $Monatstage + $(date -d "yesterday $m/1/((jahr++)) + 1 month" "+%d"))
+       done
+        Tage_bis_Congress=$(expr $Monatstage + 27 )
+       figlet "Es sind noch " $Tage_bis_Congress " bis zum nächsten ChaosCommunicationCongress"
+    else
+        # Berechne Tage bis Dezember                                                                                                                                                                                                                if [[ $Monat != 12 ]]
+        then
+          for i in $(seq $Monat 1 11)
+            do
+              Monatstage=$(expr $Monatstage + $(date -d "yesterday $m/1 + 1 month" "+%d"))
+            done
+        fi
+        Tage_bis_Congress=$(expr $Monatstage + $(expr 27 - $(date +%d)))
+        figlet "Es sind noch " $Tage_bis_Congress " bis zum nächsten ChaosCommunicationCongress"
+    fi
+}
+
+if [[ $Event = "E" ]]
+then
+    Easterhegg
+else
+    Congress
+fi
+\end{minted}
+
+\end{document}
+
+
+
+
diff --git a/haecksen-skript.sh b/haecksen-skript.sh
new file mode 100644 (file)
index 0000000..aefd74d
--- /dev/null
@@ -0,0 +1,302 @@
+#!/bin/bash
+
+#### Was sind Variabln?
+
+# Variabeln Deklarieren
+
+# Tasse="Tee"
+# echo "In meiner Tasse ist $Tasse"
+# Tasse=5
+# echo "In meiner Tasse sind $Tasse Murmeln"
+# Tasse=$(fortune)
+# echo "Die Tasse sagt \" $Tasse \" "
+
+
+### Variabeln Deklaration für unser Skript
+Monat=$(date +%m)
+Tage=$(date +%e)
+
+Event=""
+Ostersonntag=""
+Ostermonat=""
+# Farbgestaltung mit Shellescapes
+
+gruen="\e[32m"
+blau="\e[34m"
+rot="\033[1;31m"
+nc="\033[0m"
+### Ende Variabeln Deklaration für unser Skript
+
+function Übung_ein_aus_gabe()
+{
+
+    #### Ein und Ausgabe - Kommunikationsskills in der bash
+    echo "zu welchem Event möchtest du? Easterhegg oder ChaosCommunicationCongress?"
+    read MeineVariable
+    
+    echo "Du hast $MeineVariable gewählt"
+    
+    read -p "Was ist deine Lieblingszahl zwischen 0 und 10? " EineWeitereVariable
+    echo "Du hast $EineWeitereVariable gewählt"
+}
+#Übung_ein_aus_gabe
+
+EventFrage()
+{
+    ### Eingabe/Ausgabe für unser Skript
+
+    read -p "Zu welchem Event sollen die verbleibenden Tage berechnet werden?(C)ongress\(E)asterhegg " Event
+    echo "Berechne verbleibende Tage zu $Event ..."
+    ### Ende Eingabe/Ausgabe für unser Skript
+}
+#EventFrage
+
+function Übung_Logik()
+{
+    Übung_ein_aus_gabe
+    #### Wie funktioniert die Logik
+
+    test $EineWeitereVariable -le 5
+    echo $?
+
+    test $EineWeitereVariable -le 10
+    echo $?
+}
+#Übung_Logik
+
+function Übung_Logik_UND()
+{
+    Übung_ein_aus_gabe
+    ### logisches UND
+
+    test $EineWeitereVariable -gt 5 -a $EineWeitereVariable -le 10
+    echo $?
+    test $EineWeitereVariable -gt 5 && test $EineWeitereVariable -le 10
+    echo $?
+    [[ $EineWeitereVariable -gt 5 ]] && [[ $EineWeitereVariable -le 10 ]]
+    echo $?
+}
+#Übung_Logik_UND
+function Übung_Logik_ODER()
+{
+    Übung_ein_aus_gabe
+    ### logisches ODER
+
+    test $EineWeitereVariable -gt 5 -o $EineWeitereVariable -le 10
+    echo $?
+    test $EineWeitereVariable -gt 5 || test $EineWeitereVariable -le 10
+    echo $?
+    [[ $EineWeitereVariable -gt 5 ]] || [[ $EineWeitereVariable -le 10 ]]
+    echo $?
+}
+#Übung_Logik_ODER
+function Übung_if()
+{
+    EventFrage
+    #### Logik Teil2 - Wege abzweigen mit Wenn/Dann/Sonst
+
+    if [[ $Event = "C" ]]
+    then
+       echo "Du hast den ChaosCommunicationCongress gewählt"
+    fi
+
+    if [[ $Event = "E" ]]
+    then
+       echo "Du hast den Easterhegg gewählt"
+    fi
+}
+#Übung_if
+
+function Übung_if_else()
+{
+    EventFrage
+    if [[ $Event = "Congress" ]]
+    then
+       echo "Du hast den ChaosCommunicationCongress gewählt"
+       Event="C"
+    else
+       echo "Du hast den Easterhegg gewählt"
+       Event="E"
+    fi
+}
+#Übung_if_else
+
+EventAuswahl()
+{
+    if [[ $Event = "Congress" ]]  || [[ $Event = "C" ]]  
+    then
+       echo "Du hast den ChaosCommunicationCongress gewählt"
+       Event="C"
+       
+    elif [[ $Event = "Easterhegg" ]] || [[ $Event = "E" ]]
+    then
+       echo "Du hast den Easterhegg gewählt"
+       Event="E"
+    else
+       echo "Eingabe konnte die Verifiziert werden"
+       Event=""
+    fi
+}
+
+function Übung_Arrays()
+{
+    #### Was sind Arrays?
+
+    Box=(1 pinguin 2 3)
+    echo ${Box[1]}
+    echo ${Box[0]}
+    # mit newline
+    echo ${Box[@]}
+    # ohne newline
+    echo ${Box[*]}
+    echo "füge den Array was hinzu"
+    Box+=(4)
+    echo ${Box[@]}
+}
+#Übung_Arrays
+Event_Schleife()
+{
+    #### Logik Teil 3 - Schleifen drehen und ausbrechen
+    # Solange die Länge der Variable Event null ist
+    while [[ -z $Event ]]
+         # Solange bis  die Länge der Variable Event nicht null ist
+         #until [[ -n $Event ]]
+    do
+       EventFrage
+       EventAuswahl
+    done
+}
+#Event_Schleife
+function Übung_Rechnen()
+{
+    ### rechnen in bash
+
+    echo "berechne 2 + 3 Murmeln in der Tasse"
+    Tasse=$(expr 2 + 3)
+    echo "In der Tasse sind $Tasse Murmeln"
+    echo "berechne 2 * 4 Murmeln in der Tasse"
+    Tasse=$(expr 2 \* 4)
+    echo "In der Tasse sind $Tasse Murmeln"
+
+    echo "mit let berechnen"
+    let Tasse=2*4 ; echo $Tasse "Murmeln"
+
+    echo "wenn bc installiert ist mit bc"
+    echo "2*4" | bc
+}
+#Übung_Rechnen
+
+Osterberechnung()
+{
+    
+    #Spencers Osterformel zur bestimmung des Osterdatums #geklaut aus der Wikipedia                                        
+    a=$(expr $jahr % 19)
+    #echo $a                                                                                                               
+    b=$(expr $jahr / 100)
+    #echo $b                                                                                                               
+    c=$(expr $jahr % 100)
+    #echo $c                                                                                                               
+    d=$(expr $b / 4)
+    #echo $d                                                                                                               
+    e=$(expr $b % 4)
+    #echo $e                                                                                                               
+    f=$(expr $(expr $b + 8) / 25)
+    #echo $f                                                                                                               
+    g=$(expr $(expr $b - $f + 1) / 3)
+    #echo $g                                                                                                               
+    h=$(expr $(expr 19 \* $a + $b - $d - $g + 15) % 30 )
+    #echo $h                                                                                                               
+    i=$(expr $c / 4)
+    #echo $i                                                                                                               
+    k=$(expr $c % 4)
+    #echo $k                                                                                                               
+    l=$(expr $(expr 32 + 2 \* $e + 2 \* $i - $h - $k) % 7 )
+    #echo $l                                                                                                               
+    m=$(expr $(expr $a + 11 \* $h + 22 \* $l) / 451)
+    #echo $m                                                                                                               
+    Ostermonat=$(expr $(expr $h + $l - 7 \* $m + 114) / 31)
+    #echo $Ostermonat                                                                                                             
+    p=$(expr $(expr $h + $l - 7 \* $m + 114 ) % 31)
+    Ostersonntag=$(expr $p + 1)
+
+    figlet "Der der nächste Ostersonntag ist am " $Ostersonntag "." $Ostermonat
+}
+#Osterberechnung
+Easterhegg()
+{
+    Osterberechnung
+    EasterheggStart=$(expr $Ostersonntag - 2)
+    if [[ $Monat == $Ostermonat ]]
+    then
+       
+       if [[ $Tag = $EasterheggStart || $Tag -gt $EasterheggStart && $Tag -lt $(expr $EasterheggStart + 4) ]]
+       then
+            cowsay -f bunny "Willkommen beim Easterhegg"
+       fi
+
+       if [[ $Tag -lt $EasterheggStart ]]
+       then
+            Tage=$(expr $EasterheggStart - $Tag)
+            echo -e $gruen "Es sind noch " $Tage " bis zum Easterhegg "$nc
+       elif [ $Tag -gt $(expr $EasterheggStart +5) ]
+       then
+            echo -e $rot "Leider ist der Easterhegg für diese Jahr schon vorbei :-( " $nc
+       fi
+    fi
+
+    now=$(date --date="today" +%j)
+
+    if [[ $Monat -lt $Ostermonat ]]
+    then
+       easter=$(date --date="$jahr-0$Ostermonat-$EasterheggStart" +%j)
+
+       Tage=$(expr $easter - $now)
+       figlet "Es sind noch " $Tage " bis zum Easterhegg"
+    else
+       easter=$(date --date="$jahr-0$Ostermonat-$son" +%j)
+       Tage=$(expr $now + $easter)
+       figlet "Es sind noch " $Tage " bis zum Easterhegg"
+    fi
+    
+}
+#Easterhegg
+Congress()
+{
+    if [[ $Monat == 12 && $Tag -ge 27 &&  $Tag -lt 30 ]]
+    then
+       figlet "Happy Congress"
+       figlet -t "It's congress time"
+       echo "make sure to have your ticket available or use the Congress-Everywhere-Stations of Congress"
+       figlet -tf block "Be exelent to each other"
+    elif [[ $Monat == 12 && $Tag = 31 ]]
+    then
+       for i in $(seq $monat 1 11)
+        do
+            Monatstage=$(expr $Monatstage + $(date -d "yesterday $m/1/((jahr++)) + 1 month" "+%d"))
+       done
+       Tage_bis_Congress=$(expr $Monatstage + 27 )
+        figlet "Es sind noch " $Tage_bis_Congress " bis zum nächsten ChaosCommunicationCongress"
+    else       
+       # Berechne Tage bis Dezember
+       if [[ $Monat != 12 ]]
+       then
+           for i in $(seq $monat 1 11)
+           do
+               Monatstage=$(expr $Monatstage + $(date -d "yesterday $m/1 + 1 month" "+%d"))
+           done
+       fi
+       Tage_bis_Congress=$(expr $Monatstage + $(expr 27 - $(date +%d)))
+       figlet "Es sind noch " $Tage_bis_Congress " bis zum nächsten ChaosCommunicationCongress"
+    fi
+    
+}
+#Congress
+
+# Event_Schleife
+
+# if [[ $Event = "E" ]]
+# then
+#     Easterhegg
+# else
+#     Congress
+# fi
diff --git a/my-way-to-shell.pdf b/my-way-to-shell.pdf
new file mode 100644 (file)
index 0000000..5f80d0a
Binary files /dev/null and b/my-way-to-shell.pdf differ
diff --git a/my-way-to-shell.tex b/my-way-to-shell.tex
new file mode 100644 (file)
index 0000000..28bc35b
--- /dev/null
@@ -0,0 +1,796 @@
+\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}