我有一个程序,它给出了一个环境变量
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 :(得分: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,则可以在调用subshell的行上使用命令替换,以提供与新shell中的第一个命令相同的声明操作的输出。