2013-03-28 59 views
8

Sau đây là cách tôi có thể tạo mảng bash của tôi:Cách trích xuất một phần tử cụ thể từ một mảng trong BASH?

while read line 
do 
    myarr[$index]=$line 
    index=$(($index+1)) 
done < lines.txt 

Các tập tin "lines.txt" constists của chuỗi kí tự sau

hello big world! 
how are you 
where am I 

Sau khi tạo ra các ${myarr[@]} tôi có thể dễ dàng truy cập vào tất cả các yếu tố (dòng) trong mảng này phát hành

echo ${myarr[2]} 

Nhưng nếu tôi muốn trích xuất chỉ world! thì sao? Có thể trích xuất world! từ 0 phần tử của myarr không? Điều quan trọng nhất là có thể trích xuất bất kỳ từ cuối cùng nào từ phần tử myarr không?

Tôi biết rằng trong python bạn có thể làm myarr[0][3] và điều đó sẽ thực hiện thủ thuật, làm thế nào về bash?

+0

Phần tử mảng là chuỗi - bản sao của các dòng. Chúng không phải là mảng của các từ hay bất cứ thứ gì. Bạn có thể chia phần tử mảng lên nếu muốn, nhưng không có phần tách mảng tự động nào thành các từ. –

+0

vâng, điều đó có ý nghĩa – minerals

Trả lời

6

Đây là một trong nhiều cách

set ${myarr[2]} 
echo $3 
+1

Đề xuất: 'set - $ {mayarr [2]}' để nếu giá trị trong phần tử mảng là '-x -e', thì trình bao của bạn không bắt đầu dò tìm và thoát khỏi lỗi. –

+5

'a = ($ {myarr [2]}); echo $ {a [3]} 'là tương đương, và không ghi đè lên các tham số vị trí shell/function mà bạn có thể đang sử dụng cho cái gì khác. – chepner

5

Bạn có thể trích xuất chữ từ một chuỗi (đó là những gì các phần tử mảng là) bằng bộ sửa đổi trong việc mở rộng biến: # (loại bỏ tiền tố), ## (loại bỏ tiền tố , tham lam), % (xóa hậu tố) và %% (xóa hậu tố, tham lam).

$ myarr=('hello big world!' 'how are you' 'where am I') 
$ echo "${myarr[0]}"  # Entire first element of the array 
hello big world! 
$ echo "${myarr[0]##* }" # To get the last word, remove prefix through the last space 
world! 
$ echo "${myarr[0]%% *}" # To get the first word, remove suffix starting with the first space 
hello 
$ tmp="${myarr[0]#* }" # The second word is harder; first remove through the first space... 
$ echo "${tmp%% *}"  # ...then get the first word of what remains 
big 
$ tmp="${myarr[0]#* * }" # The third word (which might not be the last)? remove through the second space... 
$ echo "${tmp%% *}"  # ...then the first word again 
world! 

Như bạn có thể thấy, bạn có thể khá lạ mắt ở đây, nhưng tại một số điểm @ đề nghị của chepner biến nó thành một mảng trở nên dễ dàng hơn nhiều. Ngoài ra, các công thức mà tôi đề xuất để trích xuất từ ​​thứ hai vv là một chút mong manh: nếu bạn sử dụng công thức của tôi để trích xuất từ ​​thứ ba của một chuỗi chỉ có hai từ, cắt đầu tiên sẽ thất bại, và nó sẽ in lên từ đầu tiên (!) thay vì trống. Ngoài ra, nếu bạn có hai dấu cách trong một hàng, điều này sẽ coi nó là một từ có độ dài bằng không với một khoảng trống ở mỗi bên của nó ...

BTW, khi tạo mảng, tôi xem xét nó sạch hơn một chút để sử dụng +=(newelement) thay vì theo dõi chỉ mục mảng một cách rõ ràng:

myarr=() 
while read line, do 
    myarr+=("$line") 
done < lines.txt 
Các vấn đề liên quan