Convertendo arquivo de parâmetro em variáveis de ambiente
Normalmente, procuro analisar em vez de procurar, para evitar complexidades de certos artefatos no meu arquivo. Também me oferece maneiras de lidar com citações e outras coisas especialmente. Meu principal objetivo é manter o que vem depois do '=' como literal, mesmo as aspas duplas e os espaços.
#!/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"
Observe o pequeno truque que eu tive que fazer para considerar meu texto citado como um único parâmetro com espaço para minha cntpars
função. Havia um nível extra de avaliação necessário. Se eu não fizesse isso, como na Opção 2, eu teria passado 2 parâmetros da seguinte maneira:
A citação dupla durante a execução do comando faz com que as aspas duplas do arquivo de parâmetros sejam mantidas. Portanto, a terceira opção também falha.
A outra opção seria, obviamente, simplesmente não fornecer variáveis entre aspas duplas, como na Opção 4, e apenas garantir que você as cite quando necessário.
Apenas algo para ter em mente.
Pesquisa em tempo real
Outra coisa que gosto de fazer é fazer uma pesquisa em tempo real, evitando o uso de variáveis de ambiente:
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}"
Não é o mais eficiente, mas com arquivos menores funciona muito bem.