Parameter Expansion und String Manipulation

Uppercasing

str="foo"
echo "${str^}" # Foo
echo "${str^^}" # FOO

Lowercasing

str="FOO"
echo "${str,}" # fOO
echo "${str,,}" # foo

Slicing, Substitution und andere Shenanigans

Slicing

name="Ruven"
echo "${name:0:2}" # Ru -> Slice von 0, 2 characters
echo "${name::2}" # Ru -> Shorthand für Obiges
echo "${name::-1}" # Ruve -> Slice von 0, von rechts -1 (Negative Werte (Absoluter Wert muss!! kleiner als gesamte Länge) funktioniert erst ab `bash 4.2` Schlechte Kompatibilität)
echo "${name:(-1)}" # n -> Slicing von 1 char von rechts, bis zum Ende
echo "${name:(-2):1}" # e -> Slicing von 2 chars von rechts, dann nur einer
# Die Zahlen hier können alle auch mit Variablen ersetzt werden
length=2; echo "${name:0:length}" # Ru
str="/path/to/foo.sh"
echo "${str#*/}" # path/to/foo.sh -> # entfernt das kürzeste Match vom Muster von links
echo "${str#*.}" # sh -> Wie oben, nur mehr Match :D
echo "${str##*/}" # foo.sh -> ## entfernt das längste Match vom Muster von links (Hier, basepath, kann auch mit basepath <string> gefunden werden, der Rest dementsprechend mit dirpath)
str="/path/to/foo.sh"
echo "${str%.sh}" # /path/to/foo -> % entfernt das kürzeste Match vom Muster von rechts
echo "${str%/*}" # /path/to -> Wie oben, nur mehr Match :D
echo "${str%%o*}" # /path/t -> %% entfernt das längste Match vom Muster von rechts
echo "${str%.sh}.py" # /path/to/foo.py -> Ändert also die Dateiendung

Basepath und Dirpath mit Hilfe von Variablen

str="/path/to/foo.sh"
base="${str##*/}" # Entfernt das längste Match von links, also alles inklusive das letzte / -> foo.sh
dir="${str%${base}}" # Entfernt das kürzeste "base" Match von rechts -> /path/to/

Substitution

name="RuvenRuven"
echo "${name/R/r}" # ruvenRuven -> Ersetzt das erste Match von R mit r
echo "${name//R/r}" # ruvenruven -> Ersetzt alle Matches von R mit r
echo "${name/#Ru/r}" # rvenRuven -> Ersetzt das von links erste Match von Ru mit r (Also irgendwie das selbe, wie ohne #)
echo "${name/%ven/lan}" # RuvenRulan -> Ersetzt das erste Match von rechts von ven mit lan

Aufgabe 8 - MacOS Version

Erstelle ein Bash-Script, welches herausfindet, ob wir uns auf einem macOS System befinden.
Verwende hierzu den uname Command. Die Ausgabe kann allerdings sowohl lowercase als auch PascalCase sein.
Wir wollen nur ein einziges if verwenden.

Tipp: Die Kernelbezeichnung von macOS lautet Darwin.

Aufgabe 9 - CPP Compiling

Erstelle eine Bash-Script, welches eine .cpp Datei kompiliert. Es ist üblich, den ausgegebenen Dateien die Endung .o zu verpassen. Dies soll durch String Substitution geschehen.

Hier ist auch ein einfaches Hello World in C++ für euch <3

#include <iostream>

int main()
{
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

Tipp: g++ file.cpp -o file.o oder gcc -lstdc++ file.cpp -o file.o je nachdem was euch besser gefällt / ihr installiert habt
Fun Fact: Das lstdc++ steht für link std c++ und versorgt den GNU C Compiler (gcc) mit der Standardbibliothek von C++