Was ist der beste Weg, um eine Konfigurationsdatei in Bash zu lesen?
Sie haben beispielsweise ein Skript und möchten nicht jedes Mal, wenn Sie das Skript aufrufen, die gesamte Konfiguration manuell eingeben.
Edit 1: Ich glaube, ich habe es nicht klargestellt, also: Ich möchte ... Ich habe eine Konfigurationsdatei, die so aussieht
variable_name value
variable_name value ...
und das möchte ich lesen. Ich weiß, ich könnte es einfach nach den Argumenten durchsuchen, nach denen ich suche, oder so ... aber vielleicht gibt es einen intelligenteren Weg :)
Antworten:
Wie mbiber sagte, eine
source
andere Datei. Zum Beispiel wäre Ihre Konfigurationsdatei (sagen wirsome.config
):Und Ihr Skript könnte so aussehen:
Die vielen Dateien in der
/etc/default
Regel dienen in ähnlicher Weise als Konfigurationsdateien für andere Shell-Skripte. Ein sehr verbreitetes Beispiel aus Beiträgen hier ist/etc/default/grub
. Diese Datei wird zum Festlegen von Konfigurationsoptionen für GRUB verwendet, dagrub-mkconfig
es sich um ein Shell-Skript handelt, das diese Quelle verwendet:Wenn Sie die Konfiguration des Formulars wirklich bearbeiten müssen:
Dann könnten Sie etwas tun wie:
(Sie könnten auch so etwas tun
eval "$var=$value"
, aber das ist riskanter als die Beschaffung eines Skripts. Sie könnten das versehentlich leichter brechen als eine beschaffte Datei.)quelle
=
von Anfang an schreiben ?/etc/default
- und meistens gut gebrauchen. Wenn Ihr ahnungsloser Benutzer Zugriff auf die Konfiguration für etwas hat, das als Root ausgeführt wird, ist dies bereits ein verlorener Grund.Offensichtlich bin ich nicht der
bash
Spezialist, aber das Konzept sollte in der von Ihnen verwendeten Sprache nicht anders sein:Ein Beispiel
Im Beispiel unten können Sie ein (sehr) einfaches Skript verwenden entweder Satz eine Zeichenfolge, oder drucken Sie eine Zeichenfolge, als Satz in Ihrer Konfigurationsdatei:
Dann
So legen Sie eine Zeichenfolge in Ihrer Konfigurationsdatei fest:
Anschließend drucken Sie den in Ihrer "Konfigurationsdatei" definierten String aus:
Natürlich müssen Sie in einem echten angewandten Skript eine Menge Dinge hinzufügen, um sicherzustellen, dass die Argumente korrekt sind, um zu entscheiden, was zu tun ist, wenn die Eingabe falsch ist, die Einstellungsdatei nicht existiert usw., aber:
Das ist die Grundidee
quelle
Verwenden Sie
source
oder.
, um eine Datei zu laden.oder
Es wird außerdem empfohlen, vor dem Laden zu prüfen, ob die Datei vorhanden ist, da Sie Ihr Skript nicht weiter ausführen möchten, wenn keine Konfigurationsdatei vorhanden ist.
quelle
Ich benutze dieses ...
Conf-Datei wird mit sed analysiert und dann als einfache Variablenzuweisung ausgewertet
Erste Sed Parsing Schlüsselwerte (unterstützt auch = mit Leerzeichen umgeben)
In der zweiten Zeile werden Leerzeichen um das Zeichen = für die gültige Variablenzuordnung entfernt
Weitere sed Behandlung kann hinzugefügt werden
Alle anderen nicht übereinstimmenden Texte in der Conf-Datei werden entfernt (einschließlich # oder; Kommentar und andere).
Beachten Sie, dass einzeilige Shell-Befehle auch aus dieser Konfigurationsdatei ausgewertet werden können!
quelle
cat
. Warum rufen Siesed
zweimal hintereinander auf? Sie könnensed
Befehle wiesed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g'
sed
generiert dieser Befehl eine leere Ausgabe für die Beispielkonfigurationsdateieinträge in der Frage. -1.
Befehl und die Prozessumleitung anstelle von temporären Variablen, um die Ausgabe des Unterprozesses. <(sed ... "$CFG_FILE")
eval $(sed -r '/[^=]+=[^=]+/!d;s/\s+=\s/=/g' "$CFG_FILE")
:, um besser zu verstehen, was dort vorgeht..
erwartet eine Datei und die Prozessersetzung wird zu einer Datei erweitert.. <(echo echo foo)
funktioniert wie erwartet in Bash v4.3.11. In kleinen Beispielen spielt es wahrscheinlich keine Rolle. Ich würde es jedoch vorziehen, nicht mehrere Kilobyte durch Befehlsersetzung zu übergeben.quelle