2012-02-03 57 views
5

tôi có một chương trình mà đưa ra một biến environementđọc biến môi trường 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] 

tuy nhiên khi tôi cố gắng để truy cập vào một trong những biến này từ một kịch bản bash nó mang lại cho không có kết quả

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

tuy nhiên hoạt động này

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

bất kỳ ý tưởng nào tại sao tác nhân người dùng không hiển thị?

+0

@FatalError - Thực tế có hai dòng với chuỗi này. Cái đầu tiên gán một giá trị, nhưng cái thứ hai thiếu toán tử gán, vì vậy nó không làm gì cả. – rodrigo

+3

Dấu ngoặc '[]' dường như gây ra vấn đề. Bạn có thực sự cần chúng trong tên? Tôi không nghĩ Bash hỗ trợ các mảng với một chỉ số không phải là số. – ugoren

+0

vâng các biến môi trường được đưa ra bởi proxy, vì vậy nó có các dấu ngoặc .. tôi có thể đọc tất cả các trường không có khung khác .. – krisdigitx

Trả lời

3

Bạn cần nguồn tập lệnh thay vì chạy tập lệnh.

. set-vars-script.sh 
+0

'source set-vars-script.sh' cũng thực hiện công việc. Nhưng nó đòi hỏi gõ bàn phím ít hơn bằng cách sử dụng một dấu chấm :-) –

+0

này không làm việc, kịch bản là proxy bãi tất cả các biến môi trường và tôi đang cố gắng để đọc chúng .. – krisdigitx

1

Có lẽ bạn nên khai báo KHÁCH HÀNG mảng trước khi giao đến các yếu tố của nó:

declare -A CLIENT 
+0

nó didnt làm việc cũng – krisdigitx

3

Bạn không thể sử dụng dấu ngoặc ở dạng $ {VAR [ARITHM_EXPR]}. Nhưng bạn luôn có thể trích xuất giá trị của các biến để biến với HỢP LỆ tên:

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

Tại sao bạn không sử dụng Perl/Python cho kịch bản? Điều này giải quyết vấn đề của bạn:

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

Bạn có thể chỉnh sửa tập lệnh gán tất cả giá trị cho các biến được đánh dấu để xuất sang subshells không? Bạn có thể tạo một tập tin tạm thời không. Bash không thể xuất mảng, kết hợp hoặc lập chỉ mục; nhưng bạn có thể sử dụng biến BASH_ENV để đặt tên tệp thiết lập cho các vỏ con không tương tác. Hãy chắc chắn sử dụng khai báo -A CLIENT trước khi gán giá trị. Sau đó, thêm một cái gì đó như thế này sau tất cả các bài tập đến các mảng KHÁCH HÀNG

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

Một subshell không tương tác mới sẽ đọc và thực thi tập tin trước khi xử lý lệnh của nó. Nếu trình bao được gọi với tùy chọn -c, thì bạn có thể sử dụng lệnh thay thế bằng trên đường gọi cuộc gọi con để cung cấp đầu ra của cùng một thao tác khai báo như các lệnh đầu tiên trong trình bao mới.

Các vấn đề liên quan