set a variable in bash

set a variable in bash

Stell dir vor, es ist drei Uhr morgens. Ein automatisches Backup-Skript soll die Datenbanken deines Unternehmens sichern und auf einen Remote-Server schieben. Du dachtest, du hättest alles im Griff, aber am nächsten Morgen stellst du fest: Der gesamte Backup-Ordner auf dem Zielserver ist leer, während dein lokaler Speicher zu 100 % voll ist und die Produktion steht. Warum? Weil du versucht hast, Set A Variable In Bash zu nutzen, dabei aber ein Leerzeichen nach dem Gleichheitszeichen eingebaut hast oder die Variable in einem Subshell-Prozess verloren ging. Das Skript hat den Pfad einfach als leeren String interpretiert und rm -rf $BACKUP_DIR/* ausgeführt – glücklicherweise war der Pfad dank eines Tippfehlers nicht definiert, sodass das Skript im aktuellen Verzeichnis blieb, aber die Logik war dahin. Ich habe solche Szenarien in den letzten zehn Jahren bei großen Hosting-Providern in Frankfurt und Berlin immer wieder gesehen. Leute verlieren Stunden mit der Fehlersuche in komplexen Logikketten, nur weil sie die absoluten Grundlagen der Zuweisung nicht beachtet haben. Es kostet Zeit, es kostet Nerven und im schlimmsten Fall kostet es echte Hardware-Ressourcen.

Das Leerzeichen des Grauens beim Set A Variable In Bash

Der häufigste Fehler, den ich bei Junior-Admins und sogar bei gestandenen Entwicklern sehe, ist die Annahme, dass Bash wie Python oder JavaScript funktioniert. In fast jeder modernen Programmiersprache ist x = 10 völlig legitim. In der Bash ist das ein Todesurteil für dein Skript. Wenn du ein Leerzeichen vor oder nach dem Zuweisungsoperator setzt, interpretiert die Shell das erste Wort als Befehl und die folgenden Wörter als Argumente.

Wer MY_VAR = "wert" schreibt, bekommt die Fehlermeldung command not found: MY_VAR. Das klingt banal, aber wenn das in einem 500-Zeilen-Skript passiert, das über eine CI/CD-Pipeline läuft, suchst du dir einen Wolf. Die Bash ist hier gnadenlos. Es gibt keine Warnung, dass du vielleicht eine Zuweisung meintest. Die Shell versucht einfach, ein Programm namens MY_VAR auszuführen. Wenn du Glück hast, schlägt es sofort fehl. Wenn du Pech hast, ist MY_VAR zufällig ein Name eines anderen Skripts in deinem Pfad, und du triggerst eine Kette von Ereignissen, die du nie beabsichtigt hast.

Ich erinnere mich an einen Fall, bei dem ein Kollege Variablen für Server-IDs setzen wollte. Er schrieb ID = 5. Da ID ein Standard-Linux-Befehl ist, der die Benutzeridentität anzeigt, passierte folgendes: Das Skript gab jedes Mal die User-ID des aktuellen Nutzers aus, anstatt die Variable auf 5 zu setzen. Das Skript lief ohne Fehlermeldung durch, aber die Datenbankeinträge waren alle falsch, weil sie die User-ID statt der Server-ID enthielten. Wir haben zwei Tage gebraucht, um diesen logischen Fehler zu finden, nur weil ein Leerzeichen zu viel da war.

Die goldene Regel der Syntax

In der Praxis bedeutet das: Klebe den Variablennamen, das Gleichheitszeichen und den Wert ohne jedes Leerzeichen zusammen. Es sieht für jemanden, der sauberen Code aus anderen Sprachen gewohnt ist, hässlich aus, aber es ist der einzige Weg, wie die Bash versteht, was du von ihr willst.

Globale vs. lokale Variablen und das Export-Missverständnis

Ein weiterer Punkt, an dem viele scheitern, ist die Sichtbarkeit. Du setzt eine Variable in deinem Terminal und wunderst dich, warum das Skript, das du danach aufrufst, diese Variable nicht kennt. Oder du setzt eine Variable innerhalb einer Funktion und wunderst dich, warum sie plötzlich den Wert im gesamten Skript überschreibt.

Bash-Variablen sind standardmäßig global für das aktuelle Skript, aber sie werden nicht automatisch an Kindprozesse vererbt. Wenn du also eine Konfigurationsvariable hast, die dein Tool benutzen soll, reicht eine einfache Zuweisung nicht aus. Du musst sie exportieren. Aber Vorsicht: Exportiere nicht alles blindlings. Das vermüllt die Umgebung und kann zu Namenskollisionen führen, die extrem schwer zu debuggen sind.

Ich sehe oft Skripte, die hunderte Zeilen lang sind und in denen jede einzelne Variable mit export deklariert wird. Das ist faul und gefährlich. Wenn du eine Variable nur innerhalb einer Funktion brauchst, verwende das Schlüsselwort local. Ohne local greifst du auf den globalen Namensraum zu. In einem großen Projekt führte das einmal dazu, dass eine Zählervariable i in einer Hilfsfunktion die i-Variable der Hauptschleife überschrieb. Das Ergebnis war eine Endlosschleife, die den Server mit Log-Dateien flutete, bis die Festplatte platzte.

Das Zitieren von Werten oder warum deine Pfade kaputtgehen

Pfade mit Leerzeichen sind der natürliche Feind des Bash-Adepten. Wer Variablen ohne Anführungszeichen setzt oder aufruft, spielt russisches Roulette mit seinem Dateisystem.

Stell dir vor, du hast eine Variable für einen Projektnamen: PROJECT="Mein Projekt". Wenn du später versuchst, ein Verzeichnis damit zu erstellen mit mkdir $PROJECT, wird die Bash zwei Verzeichnisse erstellen: eines namens Mein und eines namens Projekt. Das ist fast nie das, was du willst. In der Welt der Linux-Administration führt das zu verwaisten Dateien und kaputten Skripten.

Ein Vorher/Nachher-Vergleich verdeutlicht das Problem drastisch:

Der falsche Weg (Vorher): Ein Admin schreibt ein Skript zum Verschieben von Logs. Er definiert LOG_DIR=/var/log/app data/. Er setzt die Variable ohne Anführungszeichen: TARGET=$LOG_DIR. Später nutzt er cp $SOURCE $TARGET. Die Bash sieht den Befehl nun so: cp quelle.log /var/log/app data/. Das Ergebnis: cp denkt, es soll die Datei in das Verzeichnis /var/log/app kopieren und nennt die Zieldatei data/, oder es wirft einen Fehler, wenn /var/log/app kein Verzeichnis ist. Die Daten landen irgendwo, nur nicht da, wo sie hin sollen.

Der richtige Weg (Nachher): Derselbe Admin schreibt TARGET="/var/log/app data/". Beim Kopieren nutzt er cp "$SOURCE" "$TARGET". Die doppelten Anführungszeichen zwingen die Bash, den Inhalt der Variable als ein einziges Argument zu behandeln, egal wie viele Leerzeichen darin vorkommen. Die Datei landet sicher im Ordner /var/log/app data/.

In meiner Praxis gilt: Wenn du eine Variable nutzt, setze sie in Anführungszeichen. Immer. Es gibt nur ganz wenige Ausnahmen, in denen du das Word-Splitting der Bash absichtlich provozieren willst. In 99 % der Fälle ist das Unterlassen von Anführungszeichen schlichtweg ein Fehler, der früher oder her später knallt.

Die Falle der Subshells beim Set A Variable In Bash

Dies ist ein fortgeschrittener Fehler, der selbst Profis Zeit kostet. Du nutzt eine Pipe, um Daten zu verarbeiten, und versuchst innerhalb der Pipe eine Variable zu aktualisieren.

cat datei.txt | while read line; do COUNTER=$((COUNTER+1)); done

Du erwartest, dass COUNTER nach dieser Zeile den Wert der Zeilenanzahl hat. Aber Überraschung: Nach der Schleife ist COUNTER wieder 0 oder auf dem Wert, den er vor der Schleife hatte. Warum? Weil jeder Befehl nach einer Pipe in einer Subshell ausgeführt wird. Eine Subshell ist ein eigener Prozess. Wenn du dort Set A Variable In Bash ausführst, änderst du nur die Umgebung dieses Kindprozesses. Sobald die Schleife fertig ist, stirbt der Prozess und mit ihm deine Änderung. Die Eltern-Shell bekommt davon nichts mit.

Ich habe gesehen, wie Teams ganze Monitoring-Skripte umgeschrieben haben, weil sie dachten, die Datenquelle sei defekt, dabei war es nur dieses Subshell-Verhalten. Die Lösung hier ist oft ein "Process Substitution" oder das Umstrukturieren der Schleife. Es ist frustrierend, aber so arbeitet der Kernel nun mal. Man kann die physikalischen Gesetze der Prozessverwaltung nicht ignorieren.

Datentypen und die Illusion von Sicherheit

Bash kennt eigentlich keine Datentypen. Alles ist erst mal ein String. Wenn du aber mit Zahlen rechnen willst, musst du die Arithmetik-Syntax nutzen. Viele versuchen, Variablen wie in C++ zu inkrementieren: var++. Das wird in der Bash einfach als Text interpretiert.

Wenn du wirklich sichergehen willst, dass eine Variable eine Zahl bleibt, nutze declare -i. Das zwingt die Variable in einen Integer-Kontext. Versucht dann jemand, einen Text wie "hallo" zuzuweisen, wird Bash das entweder ablehnen oder den Wert auf 0 setzen, je nach Kontext. Das bietet eine minimale Sicherheitsebene.

In einem Abrechnungssystem, das ich einmal warten musste, wurden Rabatte berechnet. Da Bash keine Fließkommazahlen beherrscht, hat ein Kollege versucht, mit Cent-Beträgen zu arbeiten, aber die Variablen falsch zugewiesen. Ohne declare -i wurden aus Versehen Strings aneinandergehängt statt addiert. Statt 100 Cent + 50 Cent kam "10050" heraus. Ein teurer Fehler, der erst bei der Monatsabrechnung auffiel. Nutze Tools wie bc für komplexe Berechnungen und verlasse dich niemals darauf, dass Bash "schon weiß", dass du gerade mit Zahlen arbeitest.

Umgebungsvariablen und die Gefahr der Namenskollision

Es gibt einen Grund, warum Profis für interne Skript-Variablen Kleinschreibung verwenden und nur für exportierte Umgebungsvariablen Großschreibung. Wenn du deine Variable PATH nennst und sie überschreibst, hast du gerade dein gesamtes System für dieses Skript unbrauchbar gemacht.

Der Befehl ls wird nicht mehr gefunden, grep ist weg, mkdir existiert nicht mehr. Warum? Weil du die Systemvariable PATH, die sagt, wo die ausführbaren Programme liegen, mit deinem eigenen Wert überschrieben hast. Ich habe schon Leute gesehen, die völlig panisch wurden, weil plötzlich "kein Befehl mehr funktionierte", nur weil sie im Skript PATH="/mein/ordner" gesetzt hatten.

Gewöhne dir an, Variablen, die nur innerhalb deines Skripts leben, klein zu schreiben, zum Beispiel logfile_path statt LOGFILE_PATH. Das schützt dich vor Kollisionen mit den tausenden Standard-Umgebungsvariablen von Linux. Es ist eine einfache Konvention, die dir massive Kopfschmerzen erspart, wenn dein Skript auf einem System läuft, das du nicht selbst konfiguriert hast.

Der Realitätscheck für den produktiven Einsatz

Machen wir uns nichts vor: Bash ist eine spröde, alte Technologie aus einer Zeit, in der Speicherplatz teurer war als Entwicklerzeit. Sie ist extrem mächtig, weil sie die Klebemasse des gesamten Linux-Ökosystems ist, aber sie verzeiht nichts. Wenn du glaubst, du kannst Bash-Skripte mal eben schnell "hinklatschen", ohne die Feinheiten der Zuweisung und des Scoping zu verstehen, wirst du scheitern.

Nicht verpassen: tablet samsung tab a 2016

Erfolgreiches Arbeiten mit der Shell erfordert Disziplin. Du musst Anführungszeichen setzen, auch wenn es nervt. Du musst überlegen, ob eine Variable exportiert werden muss oder nicht. Du musst verstehen, dass eine Pipe einen neuen Prozess startet. Es gibt keine magische Abkürzung. Wer Sicherheit und Stabilität will, muss Shellcheck verwenden – ein Tool, das deine Skripte statisch analysiert und dich auf genau diese Fehler hinweist, die ich hier beschrieben habe.

In der echten Welt der IT-Infrastruktur gewinnt nicht derjenige, der das komplexeste Skript schreibt, sondern derjenige, dessen Skript auch nach drei Jahren noch funktioniert, wenn ein anderer Admin eine Datei mit einem Leerzeichen im Namen in den überwachten Ordner legt. Bash ist ein Werkzeug für Praktiker. Behandle es mit dem Respekt, den ein scharfes Messer verdient: Es ist extrem nützlich, aber wenn du es falsch anfasst, schneidest du dich tief. Geh davon aus, dass alles, was schiefgehen kann, schiefgehen wird – und sichere deine Variablen entsprechend ab. Nur so baust du Systeme, die wirklich halten.

LZ

Lisa Zimmermann

Zwischen Tagesaktualität und Hintergrundanalyse bringt Lisa Zimmermann Struktur in komplexe Themenlagen.