**This is an old revision of the document!**
Shell-Script
#!/bin/bash
for zahl in 1 2 3 4; do printf "Zahl ist die ${zahl}\n" done
Anschließend ausführbar machen
chmod u+x
Array-Operationen
tl;dr
#!/bin/bash
fruits=("apple" "banana" "cherry")
echo "Erste Frucht: ${fruits[0]}" echo "Letzte Frucht: ${fruits[-1]}"
for fruit in ${fruits[@]}; do echo "Die Frucht ist $fruit" done
Array deklarieren und initalisieren
- Elemente in Hochkommata
- Vorsicht: Elemente durch Leerzeichen separieren
#!/bin/bash
fruits=("apple" "banana" "cherry")
Einzelnes Element ansprechen
echo "Erste Frucht: ${fruits[0]}" echo "Letzte Frucht: ${fruits[-1]}"
Iterieren ueber alle Elemente
- Notwendig: geschweifte Klammern und das
@ @um über alle Elemente zu iterieren- angesprochen wird Array wie üblich in Shell über das vorangestellte
$ - im Beispiel:
"${fruits[@]}"
for fruit in ${fruits[@]}; do echo "Die Frucht ist $fruit" done
Verwendung beim Erstellen von Dateien und Ordnern
Quick’n’Dirty
#!/bin/bash data=zentrum for fach in Deutsch Sport Mathe Physik; do for name in King Lion Duck; do mkdir -p $data/$fach/$name touch $data/$fach/$name/${name}_adresse.txt touch $data/$fach/$name/${name}_bankdaten.txt done done
Etwas edler
#!/bin/bash data=zentrum
faecher=("Deutsch" "Sport" "Mathe" "Physik") tiere=("King" "Lion" "Duck")
for fach in ${faecher[@]}; do for name in ${tiere[@]}; do mkdir -p $data/$fach/$name touch $data/$fach/$name/${name}_adresse.txt touch $data/$fach/$name/${name}_bankdaten.txt done done
Einlesen von Dateien
Jetzt ist das alles ja schön und gut - aber am Ende sind die Werte immer noch hardcoded. Doch nicht schön.
Es soll also probiert werden, einen Mechanismus zu finden, der uns erlaubt, unsere Werte aus einer Datei auszulesen
tl;dr
#!/bin/bash declare -a fruits=()
while IFS= read -r line; do fruits+=("$line") done < fruits.txt
for fruit in ${fruits[@]}; do echo "Die Frucht ist $fruit" done
Das geht schon mal, aber es validiert nicht, ob die Datei, die eingelesen werden soll, überhaupt existiert. Best practice geht anders.\ Also sollte schon einmal gecheckt werden, ob die Datei da ist.
Bedingungen in Bash
if [[ ! -f "datei" ]]; then: Überprüft, ob die Datei existiert. Wenn nicht, gibt das Skript eine Fehlermeldung aus und beendet sich.- Einfache eckige Klammern
[ ... ]:if [ "$variable" = "value" ]; then echo "Die Variable ist gleich value." fi
- Doppelte eckige Klammern
[[ ... ]]:if [[ ! -f "datei" ]]; then echo "Datei existiert nicht" exit 1 fi
Erklärung
- Bash: Verwendet eckige Klammern, um Bedingungen zu definieren. Dies ist eine spezielle Syntax für Shell-Skripte.
- Andere Sprachen: Verwenden in der Regel runde Klammern, um Bedingungen oder Ausdrücke zu gruppieren.
Shellskript: Namen aus einer Datei lesen + Ordner erstellen
#!/bin/bash declare -a namen=() declare -a faecher=() ====== Datei, die die Namen enthält ====== namenfile="namen.txt" faecherfile="faecher.txt" ====== Überprüfen, ob die Datei existiert ====== if [[ ! -f "$namenfile" ]]; then echo "Die Datei $namen existiert nicht." exit 1 fi if [[ ! -f "$faecherfile" ]]; then echo "Die Datei $faecher existiert nicht." exit 1 fi ====== Zeilenweise die Datei lesen und Ordner erstellen ====== while IFS= read -r line; do namen+=("$line") done < $namenfile while IFS= read -r line; do faecher+=("$line") done < $faecherfile seed="seed" for name in ${namen[@]}; do for fach in ${faecher[@]}; do mkdir -p $seed/${name}/${fach} done done
Verwendung von IFS
IFSsteht für “Internal Field Separator” und ist eine spezielle Umgebungsvariable in der Unix-Shell, die verwendet wird, um die Zeichen zu definieren, die als Worttrenner (Delimiter) fungieren, wenn die Shell eine Zeichenkette in einzelne Wörter aufteilt. Standardmäßig enthältIFSdie Zeichen Leerzeichen, Tabulator und Zeilenumbruch.- Standardwert von
IFS: Normalerweise sind dies Leerzeichen, Tabulatoren und Zeilenumbrüche. Das bedeutet, dass diese Zeichen verwendet werden, um Eingaben in einzelne Felder zu trennen. - Ändern von
IFS: Du kannstIFSändern, um andere Zeichen als Trennzeichen zu verwenden. Dies ist besonders nützlich, wenn du Dateien oder Zeichenketten verarbeitest, die andere Trennzeichen verwenden.
Beispiel
Im vorherigen Skript wurde IFS= verwendet, um sicherzustellen, dass führende und nachfolgende Leerzeichen in den Zeilen der Datei nicht entfernt werden. Hier ist, was passiert:
while IFS= read -r name; do ====== Verarbeitung der Zeile ====== done < "$datei"
IFS=: SetztIFSauf ein leeres Zeichen, sodass keine Zeichen als Trennzeichen verwendet werden. Dies bedeutet, dass die gesamte Zeile als ein einziges Feld gelesen wird, unabhängig von Leerzeichen oder Tabulatoren.read -r name: Liest jede Zeile der Datei in die Variablename. Der Parameter-rverhindert, dass Backslashes als Escape-Zeichen interpretiert werden.
Durch das Setzen von IFS auf ein leeres Zeichen wird sichergestellt, dass die Zeilen genau so gelesen werden, wie sie in der Datei stehen, ohne dass sie in mehrere Teile aufgeteilt werden.