2016-07-01 19 views
1

Also habe ich die einfachste Möglichkeit, Dateien lesen zu verwenden Conf für bash Skripte ist source zu verwenden, solche Dateien zu laden. Was nun, wenn ich diese Datei bearbeiten möchte?Wie kann ich eine .conf-Datei einfach bearbeiten?

Einige Code, den ich gefunden haben einen wirklich guten Job:

function set_config(){ 
    sed -i "s/^\($1\s*=\s*\).*\$/\1$2/" $conf_file 
} 

Aber, wenn der Variable noch nicht definiert ist, es ist es nicht definieren, noch nicht überprüft, ob die Parameter gut übergeben werden, isn ‚t sichern, behandelt nicht die Standardwerte etc ...

hat zuverlässige Werkzeuge/Code existiert bereits conf-Datei, die key =‚Wert‘-Paare enthalten bearbeiten? Zum Beispiel würde Ich mag Dinge tun können, wie folgt aus:

$conf_file="my_script.conf" 
conf_load $conf_file #should create the file if it doesn't exist ! 
read=$(conf_get_value "data" "default_value") #should read the value with key "data", defaulting to "default_value" 
if [[ $? = 0 ]] #we should be able to know if the read was successful 
then 
    echo "Successfully read value for field \"data\" : $read" 
else 
    echo "Default value for field \"data\" : $read" 
fi 

conf_set "something_new" "a great value!" #should add the key "something_new" as it doesn't exist 
conf_set "data" "new_value" #should edit the value with key "data" 
if [[ $? = 0 ]] 
then 
    echo "Edit successful !" 
else #something went wrong :-/ 
    echo "Edit failed !" 
fi 

vor diesem Code ausgeführt wird, würde die conf-Datei

data="some_value" 

enthalten würde und nach

data="new_value" 
something_new="a great value!" 
seinen

und der Code sollte ausgegeben werden

Ich benutze bash Version 4.3.30. Danke für Ihre Hilfe.

+0

Können Sie uns ein paar Beispiele vor und nach den Daten geben? –

+0

@ Mr.Llama Redigierte die Frage, um es klarer zu machen – Magix

Antwort

1

ich mit awk zu, dass würde, da es bei Tokenisieren ziemlich gut ist:

# overwrite config's entries for KEY with VALUE or else appends the definition 
# Usage: set_config KEY VALUE 
set_config() { 
    [ -n "$1" ] && awk -F= -v key="$1" -v new="$1=\"$2\"" ' 
    $1 == key { $0 = new; key_found = 1; } 
    { print } 
    END { if (!key_found) { print new; } 
    ' "$conf_file" > "$conf_file.new" \ 
    && cat "$conf_file.new" > "$conf_file" && rm "$conf_file.new" 
} 

Wenn ohne Argumente laufen, set_config() wird nichts tun, und false zurück. Wenn es mit nur einem Argument ausgeführt wird, wird ein leerer Wert erstellt (Ausgabe KEY="").

Der Befehl awk analysiert die .conf-Datei Zeile für Zeile und sucht nach jeder Definition des angegebenen Schlüssels und ändert sie auf den neuen Wert. Alle Zeilen werden dann gedruckt (mit oder ohne Änderung), wobei die ursprüngliche Reihenfolge beibehalten wird. Wenn der Schlüssel am Ende der Datei noch nicht gefunden wurde, hängt dies die neue Definition an.

Da Sie können nicht über die Pipeline eine Datei oben auf sich, dies mit einem „.new“ Erweiterung gespeichert wird und dann oben auf dem Original in einer Art und Weise kopiert, die Berechtigungen erhält. Die Kopie ".new" wird dann entfernt. Ich habe && verwendet, um sicherzustellen, dass diese nie passieren, wenn ein Fehler früher in der Funktion aufgetreten ist.

Beachten Sie auch, dass die Art der „Conf-Datei“ Sie beziehen sie auf (der Typen, den Sie mit einem POSIX-Shell-Quelle) wird nie Räume um ihre Zeichen gleich, so dass die \s* Teile Ihres sed Befehl nicht erforderlich.

+0

Das sieht nach einem sehr guten Start aus, ist es sicher für Werte mit Sonderzeichen etc ...? Was passiert, wenn nur ein Argument übergeben wird? – Magix

+0

Ich habe keine Bedingung für zu wenige Argumente gestellt. Zero-Argumente fügen ein blankes Gleichheitszeichen am Ende der Datei hinzu und erzeugen Fehler, wenn die Datei bezogen wird. Ein Argument (oder ein leeres zweites Argument) definiert den Schlüssel lediglich als leere Zeichenfolge. Sonderzeichen funktionieren gut, obwohl Sie sie bei der Übergabe an die 'set_config()' -Funktion angeben müssen. –

+0

Ist die Groß- und Kleinschreibung zu beachten? Kann dieses Verhalten geändert werden? Wenn eine solche Funktionalität in bash noch nicht existiert, wäre es eine gute Idee, ein Paket daraus zu machen? – Magix