2012-09-05 14 views
7

que tengo un archivo de configuración con el siguiente contenido:escritura del golpe leer las variables de archivo en las variables locales

msgs.config:

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

estoy escribiendo un script bash que lee las variables de archivos msgs.config y los almacena en variables locales. Los usaré en todo el guión. Debido al permiso, no quiero usar el método . (fuente).

tmsg 
t1msg 
t2msg 
pmsg 

Cualquier ayuda sería muy apreciada.

+1

* Debido al permiso, no quiero utilizar el. Método (fuente) * No estoy seguro de cómo eso podría ayudar, pero solo necesita permiso de lectura para usar 'fuente', y si no puede leerlo ... – cdarke

Respuesta

8

que puede utilizar:

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

Alternativamente, puede utilizar una matriz asociativa:

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

Ahora puede consultar ${keys[tmsg]} etc. para acceder a las variables. O, si la lista de variables es fijo, puede asignar los valores a las variables:

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

No es necesario guardar' oldIFS'; simplemente puede restringir el cambio en 'IFS' al comando' read' con 'while IFS =: read name value'. Además, use 'declare" $ name = $ value' en lugar de 'eval'. – chepner

+0

gracias por toda la ayuda Está sugiriendo: oldIFS =" $ IFS " IFS =": " while IFS =: read name valor do \t declare "$ name = $ value" done <$ archivo_configuración – thegreat078

+0

@ thegreat078: La sugerencia es evitar 'oldIFS' y simplemente use:' while IFS = ':' read name value' en el ciclo (por lo que no es necesario reiniciar IFS después del ciclo). Eso es razonable, suponiendo que funcione. Y si la notación 'declare $ name =" $ value "' funciona (no tengo motivos para pensar que no, pero estaba atascado en una máquina con Bash 3.2 -que no tiene matrices asociativas), entonces eso es mucho menos propenso a errores que 'eval' (que casi siempre está jugando con fuego, pero es un poco tiempos necesarios; ¡OTOH, Bash ha hecho mucho para que sea menos necesario de lo que era antes, que es A Good Thing ™!) –

1

Leer el archivo y almacenar el valores-

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 

acceder a las variables de matriz como ${key[0]}, ${key[1]}, .... y ${val[0]}, ${val[1]} ...

1

En caso de que cambie de opinión respecto a source:

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

Esto no funciona si alguno de sus valores tener comillas dobles

Cuestiones relacionadas