2012-02-03 22 views
5

私持っている私はそれが何の結果が読み取り、bashの環境変数

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

に与えない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] 

しかしenvironement変数を配るプログラムこれは動作します

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

なぜユーザーエージェントが表示されないのですか?

+0

@FatalError - 実は、この文字列を持つ2つの行があります。最初の値は値を割り当てますが、2番目の値は代入演算子がないため、何もしないでください。 – rodrigo

+3

'[]'の括弧で問題が発生しているようです。あなたは本当に名前の中にそれらを必要としますか?私はBashが非数値インデックスを持つ配列をサポートしているとは思わない。 – ugoren

+0

それはbrackets..iは罰金のすべての他の非ブラケットのフィールドを読み取ることができているので、ええ、環境変数は、プロキシによって与えられている。.. – krisdigitx

答えて

3

は、あなたはそれを実行しているのではなく、スクリプトを調達する必要があります。

. set-vars-script.sh 
+0

'source set-vars-script.sh'もそのジョブを行います。しかし、それは、それはまた、didntの仕事 –

+0

:-)このdidntの仕事を、ドットを使用して以下のキーボードタイピングが必要です – krisdigitx

1

おそらくあなたは、その要素に割り当てる前に、配列CLIENTを宣言する必要があります。

declare -A CLIENT 
+0

..シナリオは、プロキシは、すべてのこれらの環境変数をダンプすることであると私はそれらを読んしようとしています – krisdigitx

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変数を使用して、非インタラクティブなサブシェルのセットアップファイルに名前を付けることができます。 は値を割り当てる前に宣言-Aクライアントを使用してください。次に、新しい非対話型サブシェルが、そのコマンドを処理する前に、ファイルを読み込んで実行します

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

CLIENTアレイにこの後にすべての割り当てのようなものを追加します。 シェルが-cオプションを指定して呼び出された場合は、新しいシェルの最初のコマンドとして同じ宣言操作の出力を供給するためにサブシェルを呼び出す行にしてコマンド置換を使用することができます。

関連する問題