Перетворення файлу параметрів у змінні середовища
Зазвичай я займаюся розбором замість пошуку, щоб уникнути складності певних артефактів у моєму файлі. Він також пропонує мені способи спеціально обробити цитати та інші речі. Моя головна мета - зберегти все, що виникає після '=', як буквальне значення, навіть подвійні лапки та пробіли.
#!/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"
Зверніть увагу на невелику хитрість, яку мені довелося зробити, щоб розглянути мій текст, що цитується, як єдиний параметр з пробілом для моєї cntpars
функції. Був потрібен один додатковий рівень оцінки. Якби я цього не робив, як у варіанті 2, я пройшов би два параметри так:
Подвійне цитування під час виконання команди призводить до збереження подвійних лапок з файлу параметрів. Отже, 3-й варіант також не вдається.
Іншим варіантом було б, звичайно, просто не надати змінні в подвійних лапках, як у варіанті 4, а потім просто переконатися, що ви цитуєте їх при необхідності.
Просто щось пам’ятати.
Пошук у режимі реального часу
Ще одна річ, яку мені подобається робити, - це пошук у режимі реального часу, уникаючи використання змінних середовища:
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}"
Не найефективніший, але з меншими файлами працює дуже чисто.