2011-09-30 18 views
14

私はコマンド出力を解析し、結果を配列に入れています。配列を結果に代入する際の変な変数スコープBash、

内部ループを終了するまで正常に動作します - 出力配列は空です。

declare -a KEYS 

#-----------------------------------------------------------------------------# 
get_keys() 
{ 

# this extracts key NAMES from log in format "timestamp keycode" 
$glue_dir/get_keys $ip | while read line; do 
    echo line: $line 
    set -- $line # $1 timestamp $2 keycode 
    echo 1: $1 2: $2 
    key=(`egrep "\\s$2$" "$glue_dir/keycodes"`) # tested for matching '40' against 401, 402 etc 
    set -- $key # $1 key name $2 keycode 
    KEYS+=("$1") 
    echo key $1 
    echo KEYS inside loop: "${KEYS[@]}" 
done 
    echo KEYS outside loop: "${KEYS[@]}" 
} 

実行againsは、2本の出力線出力:

line: 1270899320451 38 
1: 1270899320451 2: 38 
key UP 
KEYS inside loop: UP 
line: 1270899320956 40 
1: 1270899320956 2: 40 
key DOWN 
KEYS inside loop: UP DOWN 
KEYS outside loop: 

私はこれを理解しようとしている時間を過ごしました。助けてください。 ;-)

+2

感謝の男は、あなたの質問は私を救いました!答えと同様に! – Oz123

答えて

21

パイプ(|)を使用してコマンド出力をwhileに渡すと、whileループがサブシェルで実行されます。ループが終了すると、サブシェルは終了し、変数はループ外で使用できなくなります。

利用代わりprocess substitution

while read line; do 
    # ... 
done < <($glue_dir/get_keys $ip) 
+0

私はこの解決策にとても近かったが、<<マークのために が完了しました<(コマンド)でした。 <<(コマンド)でした。 ありがとうございました。 –

+0

大歓迎です。 –

関連する問題