2013-08-14 49 views

Trả lời

1

Bạn có thể sử dụng eval:

#!/bin/bash 
array_0=(1 2 3) 
array_1=(4 5 6) 
array_2=(7 8 9) 
for a in {0..2} ; do 
    for i in {0..2} ; do 
    eval 'echo ${'"array_$a[$i]"'}' 
    done 
done 

Vaughn cú pháp Cato là hơi dài dòng hơn, nhưng tuyên bố echo chính nó là có thể đọc ra hơn. Bạn thay thế các bộ phận bên trong của for vòng lặp kép với hai dòng sau:

array_a=array_$a[$i] 
    echo ${!array_a} 
+0

Bạn có biết nếu chính nó là một mảng. Ví dụ: tôi thay thế $ a bằng $ {array_2 [$ j]} –

+0

@HaoShen: Sẽ không có vấn đề gì khi thực hiện điều đó, cho cả hai giải pháp. – jxh

+0

Xin chào, cảm ơn rất nhiều. Tôi chỉ bị mắc kẹt. Điều gì xảy ra nếu tôi muốn gán kết quả cho một biến. Ví dụ: eval 'result = $ {' "array_ $ a [$ i]" '}'. Nó không hoạt động ... Xin lỗi cho câu hỏi ngây thơ liên tục của tôi ... –

1

Bạn có thể sử dụng eval

echo $(eval echo \${array_$a[0]}) 

Lưu ý rằng tôi đã phải đặt một dấu gạch chéo ở phía trước của ký hiệu đô la đầu tiên để ngăn chặn vỏ từ nội suy đó.

Không cần phải nói, toàn bộ mục đích của mảng là cho phép bạn thực hiện loại nội suy này biến nội suy mà không có tất cả phiền toái và phiền toái của các âm thanh như tôi phải làm khi tôi cần mảng với vỏ Bourne gốc.

5

Một điều bạn có thể làm là sử dụng cú pháp sau:

array_a=array_$a[0] 
echo ${!array_a} 

Các ! như ký tự đầu tiên chỉ ra rằng bạn muốn sử dụng một cấp thêm gián tiếp bằng cách đánh giá các thay đổi và sau đó sử dụng kết quả như biểu hiện.

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