Advanced Variable Management: declare & export (Artikel 290)
Tiefgehende Analyse der Variablenverwaltung in Bash. Erfahren Sie den Umgang mit dem declare-Befehl für Typisierung, Read-only Variablen und Scoping in Funktionen.
# Variable Management: Typisierung und Scoping mit declare
TL;DR / Management Summary Bash wird oft als “typ-los” missverstanden. Während einfache Variablen immer Strings sind, erlaubt das Kommando
declare(oder sein Synonymtypeset) eine präzisere Kontrolle. Ein Senior Admin nutztdeclare, um echte Ganzzahlen (integers) zu definieren, Variablen als schreibgeschützt zu markieren oder komplexe Arrays (Artikel 248) zu initialisieren. Werdeclarebeherrscht, schreibt Skripte mit weniger logischen Fehlern und klarerem Datenfluss.
# 1. Einführung & Architektur
Warum declare nutzen?
Normalerweise ist X=5+5; echo $X gleich 5+5. Mit declare können wir Bash zwingen, mathematisch zu denken oder den Wert einer Variable einzufrieren.
# Die Werkzeug-Übersicht (Mermaid)
graph LR
A[Variable Creation] --> B{Method}
B -->|Simple| C[VAR=val: String]
B -->|Advanced| D[declare: Typed]
D --> E[-i: Integer Arithmetic]
D --> F[-r: Read-only Immutable]
D --> G[-a / -A: Arrays]
D --> H[-x: Same as export]
B -->|Local| I[local: Function Scope]
# 2. Typisierung mit declare
Mehr als nur Text.
# Ganzzahlen (Integer)
declare -i RESULT
RESULT=5+5
echo $RESULT # Output: 10 (Statt '5+5')
# Schreibschutz (Read-only)
Ideal für globale Konstanten (z.B. Pfade oder API-URLs).
declare -r CONFIG_DIR="/etc/myapp"
CONFIG_DIR="/tmp" # Fehler: CONFIG_DIR: readonly variable
# 3. Scoping: local vs. global
Variablen-Kollisionen vermeiden.
In Bash sind Variablen standardmäßig global. Das führt in großen Skripten zu unvorhersehbarem Verhalten.
my_function() {
local i=10 # Nur innerhalb der Funktion sichtbar
echo "Local i: $i"
}
i=5
my_function
echo "Global i: $i" # Output: 5 (Bleibt unverändert)
# 4. Day-2 Operations: Metadaten von Variablen
In den Speicher schauen.
# Attribute abfragen
Wollen Sie wissen, wie eine Variable definiert wurde?
# Zeigt die Definition inkl. Flags an
declare -p PATH
# Output: declare -x PATH="/usr/bin:..." (-x steht für export)
# Alle Funktionen auflisten
declare -F # Listet nur die Namen
declare -f # Zeigt den gesamten Quellcode aller geladenen Funktionen
# 5. Troubleshooting & “War Stories”
Wenn declare blockiert.
# Story 1: “Der readonly-Lock”
Symptom: Ein Skript bricht mit einer Fehlermeldung ab, weil eine Variable nicht geändert werden kann. Der Admin versucht unset oder eine Neudeklaration, aber beides scheitert.
Ursache: Eine Variable wurde mit declare -r markiert. Diese Markierung kann in der laufenden Shell-Instanz nicht rückgängig gemacht werden.
Lösung: Der Prozess muss beendet und neu gestartet werden. Lektion: Nutzen Sie readonly sparsam und nur für echte Konstanten.
# Story 2: “Zahlen-Salat ohne -i”
Symptom: Ein Admin berechnet eine Disk-Quote in einem Skript. Das Ergebnis ist 100+50+20 statt 170.
Ursache: Bash behandelt die Plus-Zeichen als Teil des Strings.
Lösung: Entweder declare -i nutzen oder die Rechnungen in doppelte Klammern setzen: (( RESULT = 100 + 50 )). declare -i ist jedoch sauberer, wenn die Variable ausschließlich für Zahlen gedacht ist.
# 6. Fazit & Empfehlung
- Sicherheit: Nutzen Sie
declare -rfür kritische Pfade am Anfang des Skripts. - Sauberkeit: Nutzen Sie immer
localin Funktionen. Es ist der wichtigste Schutz gegen schwer findende Bugs. - Wahl: Nutzen Sie
exportfür Umgebungsvariablen unddeclarefür interne Logik und Datenstrukturen.
# Anhang: Cheatsheet
| Flag | Bedeutung | Beispiel |
|---|---|---|
-i |
Integer (Ganzzahl) | declare -i X |
-r |
Read-only (Konstante) | declare -r Y |
-a |
Indiziertes Array | declare -a LIST |
-A |
Assoziatives Array | declare -A MAP |
-x |
Exportiert Variable | declare -x VAR |
-p |
Definition anzeigen | declare -p VAR |
-F |
Funktionsnamen listen | declare -F |
-f |
Funktionstext anzeigen | declare -f <name> |