Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| linux:scripting [2025/04/23 20:07] – created swe | linux:scripting [2025/12/20 14:53] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Shell-Script ====== | + | ```bash |
| + | nano zahlen.sh | ||
| + | ``` | ||
| - | < | + | ```sh |
| #!/bin/bash | #!/bin/bash | ||
| Line 8: | Line 10: | ||
| printf "Zahl ist die ${zahl}\n" | printf "Zahl ist die ${zahl}\n" | ||
| done | done | ||
| - | </ | + | ``` |
| Anschließend ausführbar machen | Anschließend ausführbar machen | ||
| - | < | + | ```sh |
| - | chmod u+x | + | chmod u+x zahlen.sh |
| - | </ | + | ``` |
| - | + | ||
| - | ===== Array-Operationen ===== | + | |
| - | + | ||
| - | **tl;dr** | + | |
| - | + | ||
| - | < | + | |
| - | # | + | |
| - | + | ||
| - | fruits=(" | + | |
| - | + | ||
| - | echo "Erste Frucht: ${fruits[0]}" | + | |
| - | echo " | + | |
| - | + | ||
| - | for fruit in ${fruits[@]}; | + | |
| - | echo "Die Frucht ist $fruit" | + | |
| - | done | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Array deklarieren und initalisieren ==== | + | |
| - | + | ||
| - | * Elemente in Hochkommata | + | |
| - | * **Vorsicht**: | + | |
| - | + | ||
| - | <code sh> | + | |
| - | # | + | |
| - | + | ||
| - | fruits=(" | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Einzelnes Element ansprechen ==== | + | |
| - | + | ||
| - | <code sh> | + | |
| - | echo "Erste Frucht: ${fruits[0]}" | + | |
| - | echo " | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Iterieren ueber alle Elemente ==== | + | |
| - | + | ||
| - | * Notwendig: geschweifte Klammern und das '' | + | |
| - | * '' | + | |
| - | * angesprochen wird Array wie üblich in Shell über das vorangestellte '' | + | |
| - | * im Beispiel: '' | + | |
| - | + | ||
| - | <code sh> | + | |
| - | + | ||
| - | for fruit in ${fruits[@]}; | + | |
| - | echo "Die Frucht ist $fruit" | + | |
| - | done | + | |
| - | </ | + | |
| - | + | ||
| - | ===== Verwendung beim Erstellen von Dateien und Ordnern ===== | + | |
| - | **Quick’n’Dirty** | ||
| - | < | + | ```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 |
| - | mkdir -p $data/ | + | mkdir -p $data/ |
| - | touch $data/ | + | touch $data/ |
| - | touch $data/ | + | touch $data/ |
| done | done | ||
| done | done | ||
| - | </ | + | ``` |
| + | ## Variablen | ||
| + | Variablennamen werden in `{}` geschrieben, | ||
| + | ```sh | ||
| + | my_var=" | ||
| + | echo " | ||
| + | ``` | ||
| + | ## Arrays | ||
| + | ```sh | ||
| + | my_array=(" | ||
| + | echo " | ||
| + | ``` | ||
| - | **Etwas edler** | + | ```sh |
| - | + | for item in "${my_array[@]}"; do | |
| - | < | + | echo "$item" |
| - | # | + | |
| - | data=zentrum | + | |
| - | + | ||
| - | faecher=(" | + | |
| - | tiere=(" | + | |
| - | + | ||
| - | for fach in ${faecher[@]}; do | + | |
| - | for name in ${tiere[@]}; do | + | |
| - | mkdir -p $data/ | + | |
| - | touch $data/ | + | |
| - | touch $data/ | + | |
| - | done | + | |
| 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. | + | ## Eckige [] statt runder Klammern () |
| - | Es soll also probiert | + | In vielen Programmiersprachen |
| + | 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 [ " |
| + | echo "Die Variable ist gleich value." | ||
| + | fi | ||
| + | ``` | ||
| - | while IFS= read -r line; do | + | - **Doppelte eckige Klammern `[[ ... ]]`**: |
| - | | + | ```bash |
| - | done < fruits.txt | + | if [[ " |
| + | | ||
| + | fi | ||
| + | ``` | ||
| - | for fruit in ${fruits[@]}; | ||
| - | 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 ==== | + | ### Erklärung |
| - | | + | - **Bash**: Verwendet eckige Klammern, um Bedingungen zu definieren. Dies ist eine spezielle Syntax für Shell-Skripte. |
| - | * **Einfache eckige Klammern '' | + | - **Andere Sprachen**: Verwenden in der Regel runde Klammern, um Bedingungen oder Ausdrücke zu gruppieren. |
| - | if [ " | + | |
| - | echo "Die Variable ist gleich value." | + | |
| - | fi | + | |
| - | </ | + | |
| - | * **Doppelte eckige Klammern '' | ||
| - | if [[ ! -f " | ||
| - | echo "Datei existiert nicht" | ||
| - | exit 1 | ||
| - | fi | ||
| - | </ | ||
| - | ==== Erklärung ==== | + | ## Shellskript: |
| - | * **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: | + | |
| - | + | ||
| - | < | + | |
| #!/bin/bash | #!/bin/bash | ||
| - | declare -a namen=() | ||
| - | declare -a faecher=() | ||
| - | |||
| # Datei, die die Namen enthält | # Datei, die die Namen enthält | ||
| - | namenfile=" | + | datei=" |
| - | faecherfile=" | + | |
| # Überprüfen, | # Überprüfen, | ||
| - | 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 " | + | |
| - | echo "Die Datei $faecher | + | |
| 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 |
| - | | + | # Leere Zeilen überspringen |
| - | done < $namenfile | + | if [[ -n " |
| + | | ||
| + | mkdir -p "$name" | ||
| + | echo " | ||
| + | fi | ||
| + | done < "$datei" | ||
| + | ``` | ||
| - | while IFS= read -r line; do | + | ### Erklärung: |
| - | | + | - `# |
| - | done < $faecherfile | + | - `datei=" |
| + | - `if [[ ! -f " | ||
| + | - `while IFS= read -r name; do`: Liest die Datei zeilenweise. | ||
| + | - `if [[ -n "$name" | ||
| + | - `mkdir -p "$name" | ||
| + | - `echo " | ||
| - | seed="seed" | + | `IFS` steht für "Internal Field Separator" |
| - | for name in ${namen[@]}; | + | |
| - | for fach in ${faecher[@]}; | + | ### Verwendung von `IFS` |
| - | mkdir -p $seed/ | + | |
| - | done | + | |
| - | done | + | |
| - | </ | + | |
| - | ==== Verwendung | + | - **Standardwert |
| - | * '' | + | - **Ändern von `IFS`**: Du kannst |
| - | * **Standardwert von '' | + | |
| - | * **Ändern von '' | + | |
| - | ==== Beispiel | + | ### Beispiel |
| - | Im vorherigen Skript wurde '' | + | Im vorherigen Skript wurde `IFS=` verwendet, um sicherzustellen, |
| - | < | + | ```bash |
| while IFS= read -r name; do | while IFS= read -r name; do | ||
| # Verarbeitung der Zeile | # Verarbeitung der Zeile | ||
| done < " | done < " | ||
| - | </ | + | ``` |
| - | * **'' | + | - **`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. |
| - | * **'' | + | |
| - | Durch das Setzen von '' | + | - **`read -r name`**: Liest jede Zeile der Datei in die Variable `name`. Der Parameter `-r` verhindert, dass Backslashes als Escape-Zeichen interpretiert |
| + | Durch das Setzen von `IFS` auf ein leeres Zeichen wird sichergestellt, | ||