读bash环境变量

时间:2012-02-03 17:43:55

标签: linux 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}

知道用户代理无法显示的原因吗?

4 个答案:

答案 0 :(得分:3)

您需要获取脚本而不是运行它。

. set-vars-script.sh

答案 1 :(得分:3)

您不能在 $ {VAR [ARITHM_EXPR]} 表单中使用大括号。但是,您始终可以使用 VALID 名称将这些变量的值提取到变量:

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

为什么不使用Perl / Python进行脚本编写?这可以解决您的问题:

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

答案 2 :(得分:1)

在分配给它的元素之前,你应该声明数组CLIENT:

declare -A CLIENT

答案 3 :(得分:0)

您是否可以编辑脚本,将所有值分配给标记为导出到子壳的变量?你能创建一个临时文件吗? Bash无法导出数组,关联或索引;但您可以使用BASH_ENV变量为非交互式子壳命名设置文件。 在分配值之前,请务必使用declare -A CLIENT。然后在所有赋值到CLIENT数组之后添加类似的内容

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

新的非交互式子shell将在处理其命令之前读取并执行该文件。 如果使用-c选项调用shell,则可以在调用subshel​​l的行上使用命令替换,以提供与新shell中的第一个命令相同的声明操作的输出。