Konvertieren der Parameterdatei in Umgebungsvariablen
Normalerweise analysiere ich statt Sourcing, um die Komplexität bestimmter Artefakte in meiner Datei zu vermeiden. Es bietet mir auch Möglichkeiten, Angebote und andere Dinge speziell zu behandeln. Mein Hauptziel ist es, alles, was nach dem '=' steht, als Literal beizubehalten, auch die doppelten Anführungszeichen und Leerzeichen.
#!/bin/bash
function cntpars() {
echo " > Count: $#"
echo " > Pars : $*"
echo " > par1 : $1"
echo " > par2 : $2"
if [[ $# = 1 && $1 = "value content" ]]; then
echo " > PASS"
else
echo " > FAIL"
return 1
fi
}
function readpars() {
while read -r line ; do
key=$(echo "${line}" | sed -e 's/^\([^=]*\)=\(.*\)$/\1/')
val=$(echo "${line}" | sed -e 's/^\([^=]*\)=\(.*\)$/\2/' -e 's/"/\\"/g')
eval "${key}=\"${val}\""
done << EOF
var1="value content"
var2=value content
EOF
}
# Option 1: Will Pass
echo "eval \"cntpars \$var1\""
eval "cntpars $var1"
# Option 2: Will Fail
echo "cntpars \$var1"
cntpars $var1
# Option 3: Will Fail
echo "cntpars \"\$var1\""
cntpars "$var1"
# Option 4: Will Pass
echo "cntpars \"\$var2\""
cntpars "$var2"
Beachten Sie den kleinen Trick, den ich machen musste, um meinen zitierten Text als einen einzelnen Parameter mit Platz für meine cntpars
Funktion zu betrachten. Es war eine zusätzliche Bewertungsebene erforderlich. Wenn ich dies nicht wie in Option 2 tun würde, hätte ich 2 Parameter wie folgt übergeben:
Durch doppelte Anführungszeichen während der Befehlsausführung werden die doppelten Anführungszeichen aus der Parameterdatei beibehalten. Daher schlägt auch die 3. Option fehl.
Die andere Option wäre natürlich, einfach keine Variablen in doppelten Anführungszeichen wie in Option 4 anzugeben und dann nur sicherzustellen, dass Sie sie bei Bedarf in Anführungszeichen setzen.
Nur etwas zu beachten.
Echtzeitsuche
Eine andere Sache, die ich gerne mache, ist eine Echtzeitsuche, bei der die Verwendung von Umgebungsvariablen vermieden wird:
lookup() {
if [[ -z "$1" ]] ; then
echo ""
else
${AWK} -v "id=$1" 'BEGIN { FS = "=" } $1 == id { print $2 ; exit }' $2
fi
}
MY_LOCAL_VAR=$(lookup CONFIG_VAR filename.cfg)
echo "${MY_LOCAL_VAR}"
Nicht die effizienteste, aber mit kleineren Dateien funktioniert sehr sauber.