2012-02-03 124 views
5

我有一個程序,它給出了一個environement變量讀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] 

然而,當我試圖訪問這個變量之一,從bash腳本它沒有給出結果

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

然而,這個作品

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

任何想法爲什麼用戶代理無法顯示?

+0

@FatalError - 實際上這個字符串有兩行。第一個賦值,但第二個缺少賦值操作符,所以它不應該做任何事情。 – rodrigo 2012-02-03 17:53:04

+3

括號'[]'似乎會導致問題。你真的需要他們的名字嗎?我不認爲Bash支持非數字索引的數組。 – ugoren 2012-02-03 18:02:29

+0

是的環境變量是由代理給出的,所以它有括號..我可以讀取所有其他非支架字段罰款.. – krisdigitx 2012-02-03 18:05:32

回答

3

您需要源代碼而不是運行它。

. set-vars-script.sh 
+0

'source set-vars-script.sh'也可以完成這項工作。但它需要更少的鍵盤打字使用點:-) – 2012-02-03 17:51:22

+0

這沒有奏效,情況是代理轉儲所有這些環境變量,我正在嘗試讀取它們.. – krisdigitx 2012-02-03 18:06:43

1

也許你應該分配給它的元素之前聲明數組客戶:

declare -A CLIENT 
+0

它沒有工作也 – krisdigitx 2012-02-03 18:38:25

3

不能在表單中使用大括號$ {VAR [ARITHM_EXPR]}。但是,你總是可以VALID名提取這些變量變量的值:

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

你爲什麼不使用Perl/Python的腳本編寫?這可解決您的問題:

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

您可以編輯腳本,將所有值分配給標記爲導出到子殼體的變量嗎?你可以創建一個臨時文件嗎? Bash不能導出數組,關聯或索引;但是您可以使用BASH_ENV變量爲非交互式子殼命名一個設置文件。 確保在分配值之前使用declare -A CLIENT。然後加入這樣的事情所有分配給客戶端陣列

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

一種新的非交互式子shell將讀取並處理其命令之前執行該文件。 如果使用-c選項調用shell,那麼可以在調用subshel​​l的行上使用命令替換,以提供與新shell中的第一個命令相同的聲明操作的輸出。