Parametre dosyasını Ortam değişkenlerine dönüştürme
Dosyamdaki bazı yapıların karmaşıklığını önlemek için genellikle kaynak bulmak yerine ayrıştırmaya devam ederim. Ayrıca, alıntıları ve diğer şeyleri özel olarak ele almam için yollar sunuyor. Temel amacım, '=' işaretinden sonra gelen her şeyi, hatta çift tırnak ve boşlukları bile birebir tutmaktır.
#!/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
}
echo "eval \"cntpars \$var1\""
eval "cntpars $var1"
echo "cntpars \$var1"
cntpars $var1
echo "cntpars \"\$var1\""
cntpars "$var1"
echo "cntpars \"\$var2\""
cntpars "$var2"
Alıntılanan metnimi işlevim için boşluk olan tek bir parametre olarak düşünmek için yapmam gereken küçük numaraya dikkat edin cntpars
. Fazladan bir değerlendirme düzeyi gerekiyordu. Bunu yapmazsam, Seçenek 2'deki gibi, 2 parametreyi şu şekilde geçirirdim:
Komut yürütme sırasında çift tırnak, parametre dosyasındaki çift tırnakların tutulmasına neden olur. Dolayısıyla 3. Seçenek de başarısız olur.
Diğer seçenek, elbette, Seçenek 4'teki gibi değişkenleri çift tırnak içinde sağlamamak ve daha sonra gerektiğinde bunları alıntı yaptığınızdan emin olmaktır.
Sadece akılda tutulması gereken bir şey.
Gerçek zamanlı arama
Yapmaktan hoşlandığım bir diğer şey de ortam değişkenlerinin kullanımından kaçınarak gerçek zamanlı bir arama yapmaktır:
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}"
En verimli değil, ancak daha küçük dosyalarla çok temiz çalışıyor.