
Ich habe einen Konfigurationsdateiinhalt wie unten.
datei.conf:
key name
value pswd
Jetzt möchte ich ein Skript schreiben, um die beiden Variablen wie oben zu haben
Skript.sh
key="name" #key as variable
value="pswd" #value as variable
. /path/to/file.conf
gibt mir den Fehler „Schlüssel und Wert-Befehl nicht gefunden“ aus.
Antwort1
versuchen
awk 'NF>1 { var=$1 ; $1 = "" ; printf "%s=\"%s\"\n",var,$0; }' file.conf > script.sh
Diese Awk-Zeile verwendet grundsätzlich das erste Feld (wenn mehr als zwei vorhanden sind) als Variablennamen und dann den Rest der Zeile als Wert (daher der $1=""
schmutzige Trick).
Gemäß dem Vorschlag von Terdon ist im angegebenen Wert kein Leerzeichen enthalten.
awk '{print $1 "=" $2 }' file.conf > script.sh
Antwort2
Vorausgesetzt, Ihre Shell ist im Bourne-Stil, wo Variablen mit definiert werden , können Sie var="value"
mit GNU Folgendes tun:sed
sed -i 's/ /="/;s/$/"/' file.conf
Oder
sed -i -e 's/ /="/' -e 's/$/"/' file.conf
Oder
perl -i -pe 's/ /="/;s/$/"/' file.conf
Im Grunde ist das alles dasselbe. Sowohl in GNU sed
als auch in bearbeitet perl
der Schalter die Datei an Ort und Stelle und ersetzt in jeder Eingabezeile durch . Die erste Ersetzung ersetzt also das erste Leerzeichen durch und die zweite Ersetzung fügt am Ende der Zeile ein hinzu ( ).-i
s/foo/bar/
foo
bar
="
"
$
Alle diese werden dies umwandeln:
key name
value pswd
key1 foo bar
Hierzu:
key="name"
value="pswd"
key1="foo bar"
Antwort3
Ich habe das, was Sie wollten, ein wenig anders interpretiert ... nämlich, dass Sie eine Möglichkeit zum Sourcen wünschen, file.conf
als wäre es eine Reihe von Shell-Variablenzuweisungen - also statt
. /path/to/file.conf
Versuchen Sie es mit
eval `while read var val; do echo "${var}='${val}'"; done < /path/to/file.conf`
Sie müssen sicherstellen, dass das Format file.conf
nicht von dem hier beschriebenen abweicht.
Beachten Sie, dass ich absichtlich eval auf die gesamte Ausgabe anwende, anstatt eval bei jeder Zuweisung innerhalb der Schleife aufzurufen, da ich nicht sicher bin, ob die Variablenzuweisungen dort global sind (sie werden möglicherweise aufgrund der umgeleiteten Eingabe in einer Unter-Shell durchgeführt – weiß das jemand genau? Ich schätze, ich könnte es einfach testen :-)
Antwort4
Doppelte Anführungszeichen sind hier möglicherweise nicht die beste Wahl, da die darin enthaltenen Zeichen , $
, "
Backslash und Backtick immer noch Sonderzeichen sind.
Ich würde stattdessen einfache Anführungszeichen ( key='name'
) verwenden, da Sie sich dann nur um das Zeichen selbst kümmern müssen '
.
sed "s/'/'\\\\''/g;s/ /='/;s/\$/'/" < file.conf > file.sh