**This is an old revision of the document!**
nano zahlen.sh
#!/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 zahlen.sh
#!/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
Variablen
Variablennamen werden in {} geschrieben, um sie klar zu referenzieren.
my_var="hello"
echo "${my_var}world" # Gibt "helloworld" aus
Arrays
my_array=("apple" "banana" "cherry")
echo "${my_array[@]}"
for item in "${my_array[@]}"; do
echo "$item"
done
Eckige [] statt runder Klammern ()
In vielen Programmiersprachen werden runde Klammern () verwendet, um Bedingungen oder Ausdrücke zu gruppieren. In Bash und anderen Shell-Skriptsprachen jedoch eckige Klammern [] oder doppelte eckige Klammern [[]]
Bash (Shell-Skript)
- Einfache eckige Klammern
[ ... ]:
if [ "$variable" = "value" ]; then echo "Die Variable ist gleich value." fi
- Doppelte eckige Klammern
[[ ... ]]:
if [[ "$variable" == "value" && -f "datei" ]]; then echo "Die Variable ist gleich value und die Datei existiert." 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 # Datei, die die Namen enthält datei="namen.txt" # Überprüfen, ob die Datei existiert if [[ ! -f "$datei" ]]; then echo "Die Datei $datei existiert nicht." exit 1 fi # Zeilenweise die Datei lesen und Ordner erstellen while IFS= read -r name; do # Leere Zeilen überspringen if [[ -n "$name" ]]; then # Ordner erstellen mkdir -p "$name" echo "Ordner $name erstellt." fi done < "$datei"
Erklärung:
#!/bin/bash: Gibt an, dass das Skript mit der Bash-Shell ausgeführt werden soll.datei="namen.txt": Der Name der Datei, die die Namen enthält. Du kannst diesen Namen ändern, um eine andere Datei zu verwenden.if [[ ! -f "$datei" ]]; then: Überprüft, ob die Datei existiert. Wenn nicht, gibt das Skript eine Fehlermeldung aus und beendet sich.while IFS= read -r name; do: Liest die Datei zeilenweise.if [[ -n "$name" ]]; then: Überprüft, ob die Zeile nicht leer ist.mkdir -p "$name": Erstellt einen Ordner mit dem Namen aus der Zeile. Der Parameter-psorgt dafür, dass keine Fehlermeldung ausgegeben wird, wenn der Ordner bereits existiert.echo "Ordner $name erstellt.": Gibt eine Bestätigungsmeldung aus.
IFS steht 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ält IFS die Zeichen Leerzeichen, Tabulator und Zeilenumbruch.
Verwendung von ''%%IFS%%''
- 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.