Ich habe eine parameters.ini-Datei, wie zum Beispiel:
[parameters.ini]
database_user = user
database_version = 20110611142248
Ich möchte die in der Datei parameters.ini angegebene Datenbankversion in einem Bash-Shell-Skript einlesen und verwenden, damit ich sie verarbeiten kann.
#!/bin/sh
# Need to get database version from parameters.ini file to use in script
php app/console doctrine:migrations:migrate $DATABASE_VERSION
Wie würde ich das machen?
Antworten:
Wie wäre es, nach dieser Zeile zu greifen und dann awk zu verwenden?
quelle
| tr -d ' '
am Ende hinzu.Sie können den nativen Bash-Parser verwenden, um INI-Werte zu interpretieren, indem Sie:
Beispieldatei:
Um auf Variablen zuzugreifen, drucken Sie sie einfach aus :
echo $var1
. Sie können auch Arrays wie oben gezeigt verwenden (echo ${IPS[@]}
).Wenn Sie nur einen einzigen Wert möchten, suchen Sie einfach danach:
Überprüfen Sie für die Demo diese Aufnahme bei asciinema .
Es ist einfach, da Sie keine externe Bibliothek benötigen, um die Daten zu analysieren, aber es hat einige Nachteile. Beispielsweise:
Wenn Sie Leerzeichen zwischen
=
(Variablenname und -wert) haben, müssen Sie zuerst die Leerzeichen kürzen, zOder wenn Sie sich nicht für die Leerzeichen interessieren (auch in der Mitte), verwenden Sie:
Um
;
Kommentare zu unterstützen , ersetzen Sie sie durch#
:Die Abschnitte werden nicht unterstützt (z. B. wenn ja
[section-name]
, müssen Sie sie wie oben gezeigt herausfiltern, z. B.grep =
), ebenso für andere unerwartete Fehler.Wenn Sie bestimmten Wert unter bestimmten Abschnitt zu lesen, Verwendung
grep -A
,sed
,awk
oderex
).Z.B
Hinweis: Wo
-A5
ist die Anzahl der Zeilen, die im Abschnitt gelesen werden sollen? Ersetzen Siesource
mitcat
zu debuggen.Wenn Sie Analysefehler haben, ignorieren Sie diese, indem Sie Folgendes hinzufügen:
2>/dev/null
Siehe auch:
quelle
source <(grep = <(grep -A5 '\[section-b\]' file.ini))
das wird nicht funktionieren: [sec a] a = 1 b = 2 c = 3 [sec b] a = 2 b = 3 [sec c] a = 0. wo es keine bestimmte Regel mit Linien gibtBash bietet keinen Parser für diese Dateien. Natürlich können Sie einen awk-Befehl oder ein paar sed-Aufrufe verwenden, aber wenn Sie Bash-Priester sind und keine andere Shell verwenden möchten, können Sie den folgenden obskuren Code ausprobieren:
Verwendung:
Bash Ini-Parser finden Sie auf der DevOps-Blog-Site von The Old School .
quelle
Sed Einzeiler, der Abschnitte berücksichtigt. Beispieldatei:
Angenommen, Sie möchten param2 aus Abschnitt2. Führen Sie Folgendes aus:
werde dir geben
quelle
"/^\[section2\]/,/^\[/{...}"
brew install gnu-sed
und dann verwendengsed
(sonstsed: illegal option -- r
)sed -nr "/^\[SECTION2\]/ { :l /^\s*[^#].*/ p; n; /^\[/ q; b l; }"
Ausdruck funktioniert? dankeFügen Sie einfach Ihre INI-Datei in den Bash-Body ein:
Datei example.ini :
Datei example.sh
quelle
Alle Lösungen, die ich bisher gesehen habe, stießen auch auf auskommentierte Zeilen. Dieser hat es nicht getan, wenn der Kommentarcode lautet
;
:quelle
| tr -d ' '
am Ende hinzu.eine oder mehrere mögliche Lösungen
quelle
Zeigen Sie den Wert von my_key in einer my_file im INI -Stil an :
-n
- Standardmäßig nichts drucken-e
- Führen Sie den Ausdruck auss/PATTERN//p
- Zeigen Sie alles an, was diesem Muster folgt. Im Muster:^
- Muster beginnt am Zeilenanfang\s
- Leerzeichen*
- null oder viele (Leerzeichen)Beispiel:
So:
quelle
bar
ausgedruckt), zumindest unter Unix / OSX.sed
Sie können
sed
die INI-Konfigurationsdatei analysieren, insbesondere wenn Sie Abschnittsnamen wie:Sie können also das folgende
sed
Skript verwenden, um die obigen Daten zu analysieren:Dadurch werden die INI-Daten in dieses flache Format konvertiert:
so wird es einfacher sein , zu analysieren , verwenden
sed
,awk
oderread
indem sie in jedem Leitungsabschnitt Namen hat.Credits & Quelle: Konfigurationsdateien für Shell-Skripte , Michael Grünewald
Alternativ können Sie dieses Projekt verwenden:
chilladx/config-parser
einen Konfigurationsparser mitsed
.quelle
Sie können das
crudini
Tool verwenden, um INI-Werte abzurufen, z.quelle
yum install crudini
Für Leute (wie mich), die INI-Dateien aus Shell-Skripten lesen möchten (Shell lesen, nicht Bash) - Ich habe die kleine Hilfsbibliothek aufgerissen, die genau das versucht:
https://github.com/wallyhall/shini (MIT-Lizenz, machen Sie damit, wie Sie möchten. Ich habe oben verlinkt und es inline eingefügt, da der Code ziemlich lang ist.)
Es ist etwas "komplizierter" als die
sed
oben vorgeschlagenen einfachen Zeilen - funktioniert aber auf einer sehr ähnlichen Basis.Die Funktion liest eine Datei zeilenweise ein und sucht nach Abschnittsmarkierungen (
[section]
) und Schlüssel- / Wertdeklarationen (key=value
).Letztendlich erhalten Sie einen Rückruf zu Ihrer eigenen Funktion - Abschnitt, Schlüssel und Wert.
quelle
Ähnlich wie bei den anderen Python-Antworten können Sie dies mithilfe des
-c
Flags tun , um eine Folge von Python-Anweisungen auszuführen, die in der Befehlszeile angegeben werden:Dies hat den Vorteil, dass nur die Python-Standardbibliothek erforderlich ist und keine separate Skriptdatei geschrieben wird.
Oder verwenden Sie ein Dokument hier, um die Lesbarkeit zu verbessern.
quelle
Einige der Antworten respektieren keine Kommentare. Einige respektieren Abschnitte nicht. Einige erkennen nur eine Syntax (nur ":" oder nur "="). Einige Python-Antworten schlagen auf meinem Computer fehl, weil die Captialisierung unterschiedlich ist oder das sys-Modul nicht importiert werden kann. Alle sind mir etwas zu knapp.
Also habe ich mein eigenes geschrieben, und wenn Sie ein modernes Python haben, können Sie dies wahrscheinlich von Ihrer Bash-Shell aus aufrufen. Es hat den Vorteil, dass einige der gängigen Python-Codierungskonventionen eingehalten werden, und bietet sogar sinnvolle Fehlermeldungen und Hilfe. Um es zu verwenden, nennen Sie es so etwas wie myconfig.py (nennen Sie es NICHT configparser.py oder es könnte versuchen, sich selbst zu importieren), machen Sie es ausführbar und nennen Sie es wie
Hier ist mein Code für Python 3.5 unter Linux:
quelle
komplexe Einfachheit
INI-Datei
test.ini
Bash-Skript mit Lesen und Ausführen
/ bin / parseini
dann beziehe ich in einem anderen Skript die Ergebnisse des Befehls und kann beliebige Variablen darin verwenden
test.sh
Schließlich ist über die Kommandozeile die Ausgabe somit
quelle
Hier ist meine Version, die Abschnitte analysiert und ein globales assoziatives Array g_iniProperties damit auffüllt . Beachten Sie, dass dies nur mit bash v4.2 und höher funktioniert.
Und hier ist ein Beispielcode mit der obigen Funktion:
quelle
Dieses Skript erhält folgende Parameter:
Das heißt, wenn Ihr INI hat:
z.B. wie man es nennt:
[ Umgebung ]
[DataBase_Sector]
Dann rufen Sie an:
Dadurch wird das folgende "Etwas" abgerufen.
das Skript "pars_ini.ksh":
quelle
Ich habe ein schnelles und einfaches Python-Skript geschrieben, das in mein Bash-Skript aufgenommen werden soll.
Zum Beispiel wird Ihre INI-Datei aufgerufen
food.ini
und in der Datei können Sie einige Abschnitte und einige Zeilen haben:Kopieren Sie dieses kleine 6-zeilige Python-Skript und speichern Sie es unter
configparser.py
In Ihrem Bash-Skript können Sie dies beispielsweise tun.
oder
Dies setzt voraus:
Hoffe es hilft : ¬)
quelle
Meine Version des Einzeilers
quelle
Ich habe gerade meinen eigenen Parser geschrieben. Ich habe versucht, verschiedene Parser zu verwenden, die hier zu finden sind. Keiner scheint sowohl mit ksh93 (AIX) als auch mit bash (Linux) zu funktionieren.
Es ist ein alter Programmierstil - Zeile für Zeile analysieren. Ziemlich schnell, da nur wenige externe Befehle verwendet wurden. Etwas langsamer, da alle Bewertungen für den dynamischen Namen des Arrays erforderlich sind.
Das INI unterstützt 3 spezielle Syntaxen:
Ich habe alle diese Syntax verwendet, um eine ziemlich komplexe, wiederverwendbare INI-Datei zu haben. Nützlich, um Produkte bei der Installation eines neuen Betriebssystems zu installieren - das tun wir oft.
Auf Werte kann mit $ {ini [$ section. $ Item]} zugegriffen werden. Das Array MUSS vor dem Aufruf definiert werden.
Habe Spaß. Hoffe, es ist nützlich für jemand anderen!
quelle
Diese Implementierung nutzt
awk
und hat die folgenden Vorteile:;
Formatierte Version :
Einzeiler :
quelle
Wenn ich in base64 ein Passwort verwende, setze ich das Trennzeichen ":", da die base64-Zeichenfolge möglicherweise "=" hat. Zum Beispiel (ich benutze
ksh
):In
parameters.ini
die Zeilepass:QWJjMTIzCg==
, und schließlich:Wenn die Linie Leerzeichen wie "
"pass : QWJjMTIzCg== "
Hinzufügen" enthält| tr -d ' '
, um sie zu trimmen:quelle
Dies verwendet das System Perl und bereinigt reguläre Ausdrücke:
quelle
Die Antwort von "Karen Gabrielyan" unter anderen Antworten war die beste, aber in einigen Umgebungen, die wir nicht haben, wie bei einer typischen Busybox, habe ich die Antwort durch den folgenden Code geändert.
quelle
Wenn Python verfügbar ist, werden im Folgenden alle Abschnitte, Schlüssel und Werte gelesen und in Variablen mit ihren Namen im Format "[Abschnitt] _ [Schlüssel]" gespeichert. Python kann INI-Dateien richtig lesen, daher nutzen wir sie.
config.ini
quelle
Sie können einen CSV-Parser xsv zum Parsen von INI-Daten verwenden.
oder aus einer Datei.
quelle
Wenn Sie Abschnitte verwenden, reicht dies aus:
Beispiel Rohausgabe:
Regexp-Analyse:
Jetzt alles zusammen:
quelle
Ich habe einen schönen Einzeiler (vorausgesetzt, Sie haben
php
undjq
installiert):quelle