2012-02-03 19 views
5

Ho un programma che dà fuori una variabile environementlettura variabile d'ambiente bash

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] 

tuttavia quando provo ad accedere a uno di questa variabile da uno script bash non dà risultato

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

tuttavia funziona

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

qualche idea del perché l'utente-agente non riesce a mostrare?

+0

@FatalError - In realtà ci sono due righe con questa stringa. Il primo assegna un valore, ma al secondo manca l'operatore di assegnazione, quindi non dovrebbe fare nulla. – rodrigo

+3

Le parentesi '[]' sembrano causare il problema. Ne hai davvero bisogno nel nome? Non credo che Bash supporti gli array con un indice non numerico. – ugoren

+0

sì le variabili di ambiente sono date dal proxy, quindi ha le parentesi..può leggere bene tutti gli altri campi non parentesi. – krisdigitx

risposta

3

È necessario creare il codice sorgente anziché eseguirlo.

. set-vars-script.sh 
+0

'source set-vars-script.sh' fa anche il lavoro. Ma richiede meno tastiere digitando un punto :-) –

+0

questo non ha funzionato, lo scenario è che il proxy scarica tutte queste variabili d'ambiente e sto cercando di leggerle .. – krisdigitx

1

Probabilmente si dovrebbe dichiarare la matrice CLIENTE prima di assegnare ai suoi elementi:

declare -A CLIENT 
+0

non ha funzionato anche – krisdigitx

3

Non è possibile usare le parentesi in forma $ {var [ARITHM_EXPR]}. Ma si può sempre estrarre valore di queste variabili alle variabili con VALIDI nomi:

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

Perché non si utilizza Perl/Python per lo scripting? Questo risolve il problema:

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

è possibile modificare lo script di assegnare tutti i valori alle variabili contrassegnate per l'esportazione verso Subshell? Puoi creare un file temporaneo. Bash non può esportare matrici, associative o indicizzate; ma puoi utilizzare la variabile BASH_ENV per denominare un file di installazione per le subshell non interattive. Assicurarsi di utilizzare declare -A CLIENT prima di assegnare valori. Quindi aggiungere qualcosa di simile dopo tutte le assegnazioni alla matrice CLIENTE

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

Un nuovo subshell non interattivo leggerà ed eseguire il file prima di elaborare i suoi comandi. Se la shell viene invocata con l'opzione -c, è possibile utilizzare una sostituzione di comando con sulla linea che chiama la sottoshell per fornire l'output della stessa operazione di dichiarazione dei primi comandi nella nuova shell.