Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
linux:scripting [2025/04/23 20:07] – created swelinux:scripting [2025/12/20 14:53] (current) – external edit 127.0.0.1
Line 1: Line 1:
-====== Shell-Script ======+```bash 
 + nano zahlen.sh 
 +```
  
-<code sh>+```sh
 #!/bin/bash #!/bin/bash
  
Line 8: Line 10:
         printf "Zahl ist die ${zahl}\n"         printf "Zahl ist die ${zahl}\n"
     done     done
-</code> +```
 Anschließend ausführbar machen Anschließend ausführbar machen
  
-<code sh> +```sh 
- chmod u+x  + chmod u+x zahlen.sh 
-</code> +```
- +
-===== Array-Operationen ===== +
- +
-**tl;dr** +
- +
-<code sh+
-#!/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 +
-</code> +
- +
-==== Array deklarieren und initalisieren ==== +
- +
-  * Elemente in Hochkommata +
-  * **Vorsicht**: Elemente durch Leerzeichen separieren +
- +
-<code sh> +
-#!/bin/bash +
- +
-fruits=("apple" "banana" "cherry"+
-</code> +
- +
-==== Einzelnes Element ansprechen ==== +
- +
-<code sh> +
-echo "Erste Frucht: ${fruits[0]}" +
-echo "Letzte Frucht: ${fruits[-1]}" +
-</code> +
- +
-==== 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[@]}"%%'' +
- +
-<code sh> +
- +
-for fruit in ${fruits[@]}; do +
-    echo "Die Frucht ist $fruit" +
-done +
-</code> +
- +
-===== Verwendung beim Erstellen von Dateien und Ordnern =====+
  
-**Quick’n’Dirty** 
  
-<code sh>+```sh
 #!/bin/bash #!/bin/bash
 data=zentrum data=zentrum
Line 75: Line 24:
 do do
         for name in King Lion Duck;          for name in King Lion Duck; 
-        do + do 
-            mkdir -p $data/$fach/$name +                mkdir -p $data/$fach/$name 
-            touch $data/$fach/$name/${name}_adresse.txt +                touch $data/$fach/$name/${name}_adresse.txt 
-            touch $data/$fach/$name/${name}_bankdaten.txt+                touch $data/$fach/$name/${name}_bankdaten.txt
         done         done
 done done
-</code>+``` 
 +## Variablen 
 +Variablennamen werden in `{}` geschrieben, um sie klar zu referenzieren. 
 +```sh 
 +my_var="hello" 
 +echo "${my_var}world"  # Gibt "helloworld" aus 
 +``` 
 +## Arrays 
 +```sh 
 +my_array=("apple" "banana" "cherry"
 +echo "${my_array[@]}" 
 +```
  
-**Etwas edler** +```sh 
- +for item in "${my_array[@]}"; do 
-<code sh+  echo "$item"
-#!/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 done
-</code>+```
  
-===== 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.+## Eckige [] statt runder Klammern ()
  
-Es soll also probiert werden, einen Mechanismus zu finden, der uns erlaubt, unsere Werte aus einer Datei auszulesen+In vielen Programmiersprachen werden runde Klammern `()` verwendetum Bedingungen oder Ausdrücke zu gruppieren.   
 +In Bash und anderen Shell-Skriptsprachen jedoch eckige Klammern `[]` oder doppelte eckige Klammern `[[]]` 
  
-**tl;dr**+### Bash (Shell-Skript)
  
-<code sh> +- **Einfache eckige Klammern `[ ... ]`**: 
-#!/bin/bash +  ```bash 
-declare -a fruits=()+  if [ "$variable" "value" ]; then 
 +    echo "Die Variable ist gleich value." 
 +  fi 
 +  ```
  
-while IFSread -r linedo +- **Doppelte eckige Klammern `[[ ... ]]`**: 
-    fruits+=("$line") +  ```bash 
-done < fruits.txt+  if [[ "$variable" == "value" && -f "datei" ]]then 
 +    echo "Die Variable ist gleich value und die Datei existiert.
 +  fi 
 +  ```
  
-for fruit in ${fruits[@]}; do 
-    echo "Die Frucht ist $fruit" 
-done 
-</code> 
  
-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 ====+### Erklärung
  
-  ''%%if [[ ! -f "datei" ]]; then%%''Überprüftob die Datei existiertWenn nicht, gibt das Skript eine Fehlermeldung aus und beendet sich+- **Bash**: Verwendet eckige Klammernum Bedingungen zu definierenDies ist eine spezielle Syntax für Shell-Skripte
-  * **Einfache eckige Klammern ''%%[ ... ]%%''**:<code bash> +**Andere Sprachen**: Verwenden in der Regel runde Klammern, um Bedingungen oder Ausdrücke zu gruppieren.
-if [ "$variable" = "value" ]; then +
-  echo "Die Variable ist gleich value.+
-fi +
-</code>+
  
-  * **Doppelte eckige Klammern ''%%[[ ... ]]%%''**:<code bash> 
-if [[ ! -f "datei" ]]; then 
-  echo "Datei existiert nicht" 
-  exit 1 
-fi 
-</code> 
  
  
-==== Erklärung ====+## Shellskript: Namen aus einer Datei lesen + Ordner erstellen
  
-  * **Bash**: Verwendet eckige Klammern, um Bedingungen zu definieren. Dies ist eine spezielle Syntax für Shell-Skripte. +```bash
-  * **Andere Sprachen**: Verwenden in der Regel runde Klammern, um Bedingungen oder Ausdrücke zu gruppieren. +
- +
-===== Shellskript: Namen aus einer Datei lesen + Ordner erstellen ===== +
- +
-<code bash>+
 #!/bin/bash #!/bin/bash
-declare -a namen=() 
-declare -a faecher=() 
- 
  
 # Datei, die die Namen enthält # Datei, die die Namen enthält
-namenfile="namen.txt" +datei="namen.txt"
-faecherfile="faecher.txt"+
  
 # Überprüfen, ob die Datei existiert # Überprüfen, ob die Datei existiert
-if [[ ! -f "$namenfile" ]]; then +if [[ ! -f "$datei" ]]; then 
-  echo "Die Datei $namen existiert nicht." +  echo "Die Datei $datei existiert nicht."
-  exit 1 +
-fi +
- +
-if [[ ! -f "$faecherfile" ]]; then +
-  echo "Die Datei $faecher existiert nicht."+
   exit 1   exit 1
 fi fi
  
 # Zeilenweise die Datei lesen und Ordner erstellen # Zeilenweise die Datei lesen und Ordner erstellen
-while IFS= read -r line; do +while IFS= read -r name; do 
-    namen+=("$line") +  # Leere Zeilen überspringen 
-done < $namenfile+  if [[ -n "$name" ]]; then 
 +    # Ordner erstellen 
 +    mkdir -p "$name" 
 +    echo "Ordner $name erstellt." 
 +  fi 
 +done < "$datei" 
 +```
  
-while IFS= read -r line; do +### Erklärung: 
-    faecher+=("$line") +- `#!/bin/bash`: Gibt an, dass das Skript mit der Bash-Shell ausgeführt werden soll. 
-done < $faecherfile+- `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 `-p` sorgt dafür, dass keine Fehlermeldung ausgegeben wird, wenn der Ordner bereits existiert. 
 +- `echo "Ordner $name erstellt."`: Gibt eine Bestätigungsmeldung aus.
  
-seed="seed" +`IFS` steht für "Internal Field Separatorund 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. 
-for name in ${namen[@]}; do + 
-    for fach in ${faecher[@]}; do +### Verwendung von `IFS`
-        mkdir -p $seed/${name}/${fach} +
-    done +
-done +
-</code>+
  
-==== 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.
  
-  * ''%%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. +- **Ändern von `IFS`**: Du kannst `IFSändern, um andere Zeichen als Trennzeichen zu verwenden. Dies ist besonders nützlich, wenn du Dateien oder Zeichenketten verarbeitest, die andere Trennzeichen verwenden.
-  * **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 kannst ''%%IFS%%'' ändern, um andere Zeichen als Trennzeichen zu verwenden. Dies ist besonders nützlich, wenn du Dateien oder Zeichenketten verarbeitest, die andere Trennzeichen verwenden.+
  
-==== Beispiel ====+### 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:+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:
  
-<code bash>+```bash
 while IFS= read -r name; do while IFS= read -r name; do
   # Verarbeitung der Zeile   # Verarbeitung der Zeile
 done < "$datei" done < "$datei"
-</code>+```
  
-  * **''%%IFS=%%''**: Setzt ''%%IFS%%'' auf 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+**`IFS=`**: Setzt `IFSauf 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 Variable ''%%name%%''. Der Parameter ''%%-r%%'' verhindert, 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 stehenohne dass sie in mehrere Teile aufgeteilt werden.+- **`read -r name`**: Liest jede Zeile der Datei in die Variable `name`. Der Parameter `-r` verhindert, 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.