Konwersja pliku parametrów na zmienne środowiskowe
Zwykle zajmuję się analizowaniem zamiast pozyskiwaniem, aby uniknąć złożoności niektórych artefaktów w moim pliku. Oferuje mi również sposoby specjalnego traktowania cytatów i innych rzeczy. Moim głównym celem jest zachowanie literału po znaku „=”, nawet podwójnych cudzysłowów i spacji.
#!/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"
Zwróć uwagę na małą sztuczkę, którą musiałem zrobić, aby potraktować mój cytowany tekst jako pojedynczy parametr ze spacją do mojej cntpars
funkcji. Wymagany był jeden dodatkowy poziom oceny. Gdybym tego nie zrobił, jak w Opcji 2, przekazałbym 2 parametry w następujący sposób:
Podwójne cudzysłowy podczas wykonywania polecenia powoduje zachowanie podwójnych cudzysłowów z pliku parametrów. Dlatego trzecia opcja również zawodzi.
Inną opcją byłoby oczywiście po prostu nie podawanie zmiennych w podwójnych cudzysłowach, jak w opcji 4, a następnie po prostu upewnienie się, że w razie potrzeby zacytujesz je.
Tylko coś do zapamiętania.
Wyszukiwanie w czasie rzeczywistym
Inną rzeczą, którą lubię robić, jest wyszukiwanie w czasie rzeczywistym, unikając użycia zmiennych środowiskowych:
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}"
Nie jest to najbardziej wydajne, ale przy mniejszych plikach działa bardzo czysto.