Durchlaufen Sie mehrere Dateien in einem Ordner und weisen Sie einen Wert zu

Durchlaufen Sie mehrere Dateien in einem Ordner und weisen Sie einen Wert zu

Ich habe einen Ordner mit dem Namen MyPropertiesund er enthält mehrere .propertiesDateien wie 1.properties, 2.properties, 3.propertiesusw. Jede Datei enthält etwas wie:

keyname=value 

Was muss ich hier als Wert in die Properties-Datei schreiben, damit dieser zugewiesen bzw. ersetzt wird? Wie iteriere ich in einem Bash-Skript darüber und weise den Wert dem Schlüssel zu?

Pseudocode:

#!/bin/bash
valuetobepassed="something"
#iterate over each file in the folder and replace/assign value corresponding to keyname

Antwort1

Sie können sedzum Ersetzen von Werten in Dateien Folgendes verwenden:

#!/bin/bash

new_value=5
for f_name in MyProperties/*.properties; do
     sed -i "s/^keyname=.*$/keyname=$new_value/" "$f_name"
done

Antwort2

Wenn Sie wirklich mehrere Dateien mit varName=valuePaaren haben, müssen Sie nurQuelleiterieren Sie also über alle .propertiesDateien und geben Sie die Quelle jeder einzelnen an:

for file in /path/to/MyProperties/*.properties; do
    . "$file"
done

Sie haben nun alle Variablen in Ihrem Skript definiert. Zur Veranschaulichung:

$ cat foo.properties 
foo="bar"
$ echo "$foo"  ## no value

$ . ./foo.properties 
$ echo "$foo"
bar

Dies setzt voraus, dass Ihre .propertiesDateiennichts als Variable=Wert-Paare. Beim Sourcing wird jede Zeile der Datei in der Shell ausgeführt, die das Sourcing-Skript ausführt. Daher .propertieswerden auch alle Befehle in Ihren Dateien ausgeführt. Und jeder Angreifer mit Zugriff darauf MyPropertieskann dort einen bösartigen Befehl hinzufügen. Tun Sie dies also nur, wenn Sie sich über den Inhalt der Dateien sicher sind.

Beachten Sie, dass es wichtig ist, dass der dem .integrierten Element angegebene Pfad ein Zeichen enthält /(daher das ./foo.propertiesObige), da die Datei sonst in den Verzeichnissen von statt im aktuellen Verzeichnis gesucht wird $PATH(im Fall von bashund wenn sich kein POSIX-Konformitätsmodus befindet, wird im aktuellen Arbeitsverzeichnis . filenach gesucht , wenn sie in nicht gefunden wurde ).file$PATH

verwandte Informationen