Преобразование файла параметров в переменные окружения
Обычно я занимаюсь разбором вместо поиска, чтобы избежать сложностей определенных артефактов в моем файле.Он также предлагает мне способы специально обрабатывать кавычки и другие вещи.Моя главная цель - сохранить все, что следует после '=', в виде литерала, даже двойные кавычки и пробелы.
#!/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, я бы передал 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}"
Не самый эффективный, но с небольшими файлами работает очень чисто.