2012-02-03 123 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中的第一个命令相同的声明操作的输出。