So verwenden Sie Zeichenfolgen in einer Datei als Variable

So verwenden Sie Zeichenfolgen in einer Datei als Variable

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.confgibt 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 sedals auch in bearbeitet perlder 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 ( ).-is/foo/bar/foobar=""$

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.confals 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.confnicht 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

verwandte Informationen