🔄 1. Schleifen & Sicheres Stream-Reading
Das korrekte Einlesen strukturierter Datenzeilen (z.B. CSV, Passwörter, Logfiles) ist eine fundamentale DevOps-Kompetenz:
# 🎯 1. Sicheres zeilenweises Einlesen:
while IFS= read -r line; do
echo "Verarbeite: $line"
done < /etc/hosts
# 🎯 2. CSV-Parsing direkt in der Shell:
while IFS=',' read -r host ip status; do
echo "Server $host ($ip) ist $status"
done < servers.csv
🗂️ 2. Indizierte vs. Assoziative Arrays (declare -A)
Seit Bash 4 kannst du echte Key-Value-Maps im Speicher halten:
# 🎯 1. Indiziertes Array:
SERVICES=("nginx" "postgres" "redis")
SERVICES+=("rabbitmq")
echo "Erster Dienst: ${SERVICES[0]}"
echo "Anzahl Dienste: ${#SERVICES[@]}"
# 🎯 2. Assoziatives Array (Hashmap):
declare -A PORT_MAP=(
["http"]="80"
["https"]="443"
["ssh"]="22"
)
PORT_MAP["database"]="5432"
echo "HTTPS-Port: ${PORT_MAP["https"]}"
echo "Alle Keys: ${!PORT_MAP[@]}"
Indiziertes Array (arr[0]): Wie ein Stapel nummerierter Schuhkartons. Du findest Dinge nur über ihre Etagen-Nummer (0, 1, 2...).
Assoziatives Array (declare -A): Dein Adressbuch. Du suchst nicht nach Seite 4, sondern schlägst direkt das Stichwort "database" auf und hast sofort die IP-Adresse zur Hand!
📑 3. Cheat-Sheet: Arrays & getopts
| Konstrukt | Beispiel | Zweck |
|---|---|---|
declare -A map |
declare -A conf=([a]=1 [b]=2) |
Deklariert assoziatives Array (Key-Value) |
${!map[@]} |
for k in "${!map[@]}"; do |
Iteriert über alle Keys der Map |
${map[@]} |
echo "${map[@]}" |
Liefert alle Werte (Values) |
while IFS= read -r |
while IFS= read -r l; do |
Standard für zeilenweises Einlesen |
getopts "e:p:v" opt |
./script.sh -e prod -p 443 -v |
POSIX-konformes Parsing von CLI-Optionen |
🎯 Aufgaben & Checkliste in aufgabe.sh
Wenn du getopts innerhalb von Funktionen aufrufst, setze zu Beginn immer local OPTIND=1, damit nachfolgende Funktionsaufrufe den Parsing-Index von vorne beginnen!