Conversion d'un fichier de paramètres en variables d'environnement
Habituellement, je procède à l'analyse au lieu de l'approvisionnement, pour éviter la complexité de certains artefacts dans mon fichier. Il me propose également des moyens de gérer spécialement les devis et autres choses. Mon objectif principal est de conserver tout ce qui vient après le «=» comme un littéral, même les guillemets et les espaces.
#!/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"
Notez la petite astuce que j'ai dû faire pour considérer mon texte cité comme un seul paramètre avec un espace pour ma cntpars
fonction. Il y avait un niveau d'évaluation supplémentaire requis. Si je ne faisais pas cela, comme dans l'option 2, j'aurais passé 2 paramètres comme suit:
Les guillemets doubles lors de l'exécution de la commande entraînent la conservation des guillemets doubles du fichier de paramètres. Par conséquent, la 3e option échoue également.
L'autre option serait bien sûr de simplement ne pas fournir de variables entre guillemets, comme dans l'option 4, et ensuite de simplement vous assurer de les citer en cas de besoin.
Juste quelque chose à garder à l'esprit.
Recherche en temps réel
Une autre chose que j'aime faire est de faire une recherche en temps réel, en évitant l'utilisation de variables d'environnement:
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}"
Pas le plus efficace, mais avec des fichiers plus petits fonctionne très proprement.