linux-cli-shell cli shell scripting declare readonly advanced

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 Synonym typeset) eine präzisere Kontrolle. Ein Senior Admin nutzt declare, um echte Ganzzahlen (integers) zu definieren, Variablen als schreibgeschützt zu markieren oder komplexe Arrays (Artikel 248) zu initialisieren. Wer declare beherrscht, 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 -r für kritische Pfade am Anfang des Skripts.
  • Sauberkeit: Nutzen Sie immer local in Funktionen. Es ist der wichtigste Schutz gegen schwer findende Bugs.
  • Wahl: Nutzen Sie export für Umgebungsvariablen und declare fü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>