2012-09-05 24 views
7

Mam plik konfiguracyjny o następującej treści:skrypt bash odczytać zmienne plików do zmiennych lokalnych

msgs.config:

tmsg:This is Title Message! 
t1msg:This is T1Message.  
t2msg:This is T2Message.  
pmsg:This is personal Message! 

Piszę skrypt bash, który odczytuje zmienne plików msgs.config i przechowuje je w zmiennych lokalnych. Użyję ich w całym scenariuszu. Z powodu pozwolenia nie chcę korzystać z metody . (źródło).

tmsg 
t1msg 
t2msg 
pmsg 

Każda pomoc zostanie bardzo doceniona.

+1

* Z powodu pozwolenia nie chcę korzystać z. method (source) * nie wiesz jak to by pomogło, ale potrzebujesz tylko prawa odczytu, aby użyć 'source', a jeśli nie możesz go przeczytać ... – cdarke

Odpowiedz

8

Można użyć:

oldIFS="$IFS" 
IFS=":" 
while read name value 
do 
    # Check value for sanity? Name too? 
    eval $name="$value" 
done < $config_file 
IFS="$oldIFS" 

Alternatywnie możesz użyć tablicy asocjacyjnej:

declare -A keys 
oldIFS="$IFS" 
IFS=":" 
while read name value 
do 
    keys[$name]="$value" 
done < $config_file 
IFS="$oldIFS" 

Teraz możesz przejść do ${keys[tmsg]} itd., Aby uzyskać dostęp do zmiennych. Lub, jeśli lista zmiennych jest ustalona, ​​można mapować wartości do zmiennych:

tmsg="${keys[tmsg]}" 
+1

Nie trzeba zapisywać' oldIFS'; możesz po prostu ograniczyć zmianę w 'IFS' do polecenia' read' za pomocą 'while IFS =: read name value'. Używaj również opcji "declare" $ name = $ value zamiast "eval" . – chepner

+0

dzięki za pomoc. Sugerujesz: oldIFS = "$ IFS" IFS = ":" natomiast IFS =: odczytać nazwę wartość do \t zadeklaruj "$ nazwa = wartość $" zrobione <$ plik_konfiguracyjny – thegreat078

+0

@ thegreat078: Propozycja polega na uniknięciu 'oldIFS' i po prostu użyj:' while IFS = ':' odczytaj wartość nazwy' w pętli (więc nie trzeba resetować IFS po pętli) Jest to uzasadnione, zakładając, że działa.I jeśli notacja 'declare $ name =" $ value "' działa (nie mam powodu sądzić, że tak nie jest, ale utknął na maszynie z Bash 3.2 - która nie ma tablic asocjacyjnych), to jest zdecydowanie o wiele mniej podatny na błędy niż "eval" (który prawie zawsze bawi się ogniem, ale jest trochę razy konieczne; OTOH, Bash zrobił wiele, aby uczynić go mniej potrzebnym niż kiedyś, czyli A Good Thing ™!). –

1

Czytaj plik i przechowywać values-

i=0 
config_file="/path/to/msgs.config" 

while read line 
do 
    if [ ! -z "$line" ] #check if the line is not blank 
    then 
    key[i]=`echo $line|cut -d':' -f1` #will extract tmsg from 1st line and so on 
    val[i]=`echo $line|cut -d':' -f2` #will extract "This is Title Message!" from line 1 and so on 
    ((i++)) 
    fi 
done < $config_file 

dostęp do zmiennych tablicowych jako ${key[0]}, ${key[1]}, .... i ${val[0]}, ${val[1]} ...

1

W przypadku, gdy zmienisz zdanie na temat source:

source <(sed 's/:\(.*\)/="\1"/' msgs.config) 

ten nie działa, jeśli którykolwiek z wartościami mieć podwójne cytaty.

Powiązane problemy