2012-02-03 16 views
5

Tengo un programa que da a cabo una variable environement embargolectura variable de entorno fiesta

TIME=1328189073 
CLIENT[if-modified-since]=Thu, 02 Feb 2012 12:09:40 GMT 
HTTP_FILE=/news/rss.xml?edition=uk 
HTTP_PORT=80 
HTTP_HOST=feeds.bbci.co.uk 
HTTP_PROTO=http 
CLIENT[host]=feeds.bbci.co.uk 
CLIENTID=10 
CLIENT[user-agent]=Safari 
PWD=/ 
VERSION=SR.4.2.2.MR.20110523 
CLIENT[accept]=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
SHLVL=1 
CLIENT[accept-language]=en-gb,en;q=0.5 
INTERFACE=192.168.221.196 
CLIENT[cache-control]=max-age=0 
CLIENT[accept-encoding]=gzip, deflate 
HTTP_METHOD=GET 
CLIENT[user-agent] 

cuando intento acceder a una de esta variable a partir de una escritura del golpe no da resultado

echo ${CLIENT[user-agent]} >> ${LOG} 

embargo esto funciona

echo ${TIME} ${CLIENTID} ${USERNAME} ${IP} ${HTTP_METHOD} ${HTTP_PROTO} ${HTTP_HOST} ${HTTP_PORT} ${HTTP_FILE} ${SIZE} >> ${LOG} 

¿Alguna idea de por qué el user-agent no se muestra?

+0

@FatalError - En realidad hay dos líneas con esta cadena. El primero asigna un valor, pero el segundo carece del operador de asignación, por lo que no debería hacer nada. – rodrigo

+3

Los corchetes '[]' parecen causar el problema. ¿Realmente los necesitas en el nombre? No creo que Bash admita matrices con un índice no numérico. – ugoren

+0

Sí, las variables de entorno las da el proxy, por lo que tiene los paréntesis .. Puedo leer todos los demás campos sin corchetes. – krisdigitx

Respuesta

3

Necesita originar su script en lugar de ejecutarlo.

. set-vars-script.sh 
+0

'source set-vars-script.sh' hace el trabajo también. Pero requiere menos teclado escribiendo con un punto :-) –

+0

esto no funcionó, el escenario es que el proxy volca todas estas variables de entorno y estoy tratando de leerlas ... – krisdigitx

1

Probablemente usted debe declarar la matriz CLIENTE antes de asignar a sus elementos:

declare -A CLIENT 
+0

tampoco funcionó – krisdigitx

3

No se puede utilizar llaves en forma $ {VAR [ARITHM_EXPR]}. Pero siempre se puede extraer valor de estas variables a las variables con VÁLIDA nombres:

 
    $ set | sed -n '/CLIENT\[user-agent]=/{s|.*=||;p;q;}' 

¿Por qué no se utiliza Perl/Python para secuencias de comandos? Esto resuelve el problema:

 
    import os 
    print(os.environ['CLIENT[user-agent]']) 
0

¿Se puede editar el script asignar todos los valores a las variables marcadas para la exportación a subcapas? ¿Puedes crear un archivo temporal? Bash no puede exportar matrices, asociativas o indexadas; pero puede usar la variable BASH_ENV para nombrar un archivo de configuración para subcapas no interactivas. Asegúrese de usar declarar -A CLIENTE antes de asignar valores. A continuación, añadir algo como esto después de todas las asignaciones a la matriz CLIENTE

declare -A -p CLIENT > /tmp/bash_env_tmp 
    export BASH_ENV=/tmp/bash_env_tmp 

Un nuevo subnivel no interactivo leerá y ejecutar el archivo antes de procesar sus órdenes. Si se invoca el shell con la opción -c, puede usar una sustitución de comando en la línea que llama a la subshell para suministrar el resultado de la misma operación de declaración que los primeros comandos en el nuevo shell.

Cuestiones relacionadas