Conversión de archivo de parámetros a variables de entorno
Por lo general, analizo en lugar de buscar, para evitar complejidades de ciertos artefactos en mi archivo. También me ofrece formas de manejar especialmente las citas y otras cosas. Mi objetivo principal es mantener lo que viene después del '=' como literal, incluso las comillas dobles y los espacios.
#!/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"
Tenga en cuenta el pequeño truco que tuve que hacer para considerar mi texto citado como un solo parámetro con espacio para mi cntpars
función. Se requería un nivel adicional de evaluación. Si no hiciera esto, como en la Opción 2, habría pasado 2 parámetros de la siguiente manera:
Las comillas dobles durante la ejecución del comando hacen que se mantengan las comillas dobles del archivo de parámetros. Por lo tanto, la tercera opción también falla.
La otra opción sería, por supuesto, simplemente no proporcionar variables en comillas dobles, como en la Opción 4, y luego simplemente asegurarse de que las cita cuando sea necesario.
Sólo algo para tener en cuenta.
Búsqueda en tiempo real
Otra cosa que me gusta hacer es hacer una búsqueda en tiempo real, evitando el uso de variables de entorno:
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}"
No es el más eficiente, pero con archivos más pequeños funciona de manera muy limpia.