2011-09-30 30 views
14

Tôi đang phân tích lệnh đầu ra và đưa kết quả vào mảng.Bash, phạm vi biến lạ khi điền vào mảng với kết quả

Hoạt động tốt cho đến khi thoát khỏi vòng lặp bên trong - mảng đầu ra trống.

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[@]}" 
} 

Sản lượng khi agains chạy hai dòng đầu ra:

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: 

tôi đã dành một giờ cố gắng để con số này ra. Hãy giúp tôi. ;-)

+2

Cảm ơn người đàn ông, câu hỏi của bạn đã cứu tôi! cũng như câu trả lời! – Oz123

Trả lời

21

Khi bạn sử dụng đường ống (|) để chuyển đầu ra lệnh của mình tới while, vòng lặp while của bạn chạy trong một vỏ con. Khi vòng lặp kết thúc, subshell của bạn chấm dứt và các biến của bạn sẽ không có sẵn bên ngoài vòng lặp của bạn.

Sử dụng process substitution thay vì:

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

Tôi đã rất gần với giải pháp này, nhưng không thành công do <

+0

Bạn đang rất hoan nghênh. –

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