2011-06-21 38 views
19

Tôi có một mảng trong Bash, mỗi phần tử là một chuỗi. Làm thế nào tôi có thể nối thêm một chuỗi khác vào từng phần tử? Trong Java, mã giống như sau:Làm thế nào để nối thêm một chuỗi vào mỗi phần tử của một mảng Bash?

for (int i=0; i<array.length; i++) 
{ 
    array[i].append("content"); 
} 
+0

Strings là không thay đổi trong Java, và không có một phương pháp append. 'không thể tìm thấy biểu tượng biểu tượng: phương thức chắp thêm (java.lang.String) vị trí: class java.lang.String \t \t mảng [i] .append (" content ");' Đơn giản cho vòng lặp nên chậm - sau 5 năm - cũng được chấp nhận. 'for (String s: array) System.out.println (s +" content ");' –

Trả lời

13

Tested, và nó hoạt động:

array=(a b c d e) 
cnt=${#array[@]} 
for ((i=0;i<cnt;i++)); do 
    array[i]="${array[i]}$i" 
    echo "${array[i]}" 
done 

sản xuất:

a0 
b1 
c2 
d3 
e4 

EDIT: khai báo của array có thể được rút ngắn xuống còn

array=({a..e}) 

Để giúp bạn hiểu mảng và cú pháp của chúng trong bash, reference là một khởi đầu tốt. Ngoài ra, tôi khuyên bạn nên giải thích bash-hackers.

+0

nó hoạt động ... nhưng hơi khó hiểu. u có thể giải thích "{}" có nghĩa là gì, như trong $ {array [i]}? tại sao không phải mảng $ [$ i]? – Richard

+3

@Richard: thật không may, cú pháp cần thiết để làm việc với mảng bash là ... arcane để đặt nó nhẹ; Tôi không tin rằng nó có thể được giải thích _easier_ hơn là người đàn ông trang cho bash hiện nó. (Hơn nữa, điều này đóng vai trò là 'dấu hiệu tránh xa' đối với tôi) – sehe

+0

'mảng [i] =" $ {mảng [i]} $ i "' có thể được đơn giản hóa thành: 'mảng [$ i] + =" $ i "' –

2

Bạn chuyển độ dài của mảng làm chỉ mục cho bài tập. Độ dài là 1-dựa và mảng là 0 dựa trên lập chỉ mục, do đó, bằng cách vượt qua chiều dài trong bạn đang nói bash để gán giá trị của bạn vào khe sau khi cuối cùng trong mảng. Để có được độ dài của một mảng, bạn sử dụng cú pháp ${array[@]} này.

declare -a array 
array[${#array[@]}]=1 
array[${#array[@]}]=2 
array[${#array[@]}]=3 
array[${#array[@]}]=4 
array[${#array[@]}]=5 
echo ${array[@]} 

Tạo

1 2 3 4 5 
+0

câu trả lời hay. đáng tiếc là cú pháp bắt buộc (tội lỗi thuế) không thể đủ than phiền – sehe

+0

Chỉ đọc lại câu hỏi và nhận ra rằng tôi đã trả lời một cái gì đó hơi khác. Tôi sẽ để lại câu trả lời ở đây mặc dù kể từ khi nó vẫn còn có một số thông tin có giá trị liên quan đến mảng trong bash. –

+0

'mảng + = (1)'; 'mảng + = (2)'; ... 'mảng + = (vv)' –

66

Bạn có thể nối thêm một chuỗi vào mọi mục mảng ngay cả khi không lặp trong Bash!

# cf. http://codesnippets.joyent.com/posts/show/1826 
array=(a b c d e) 
array=("${array[@]/%/_content}") 
printf '%s\n' "${array[@]}" 
+0

Tốt nhất! Không phải là câu trả lời chính xác cho câu hỏi, nhưng là người chiến thắng không thể nghi ngờ của cuộc thi do-it-short! +1 – Rajish

+2

Liên kết Joyent bị hỏng, hãy xem http://web.archive.org/web/20101114051536/http://codesnippets.joyent.com/posts/show/1826 thay thế (Máy Wayback cho liên kết đó). –

+1

Lưu ý: điều này thực sự lặp lại trong nội bộ. –

52

Như đã đề cập bởi hal

array=("${array[@]/%/_content}") 

sẽ nối 'content' chuỗi cho mỗi yếu tố.

array=("${array[@]/#/prefix_}") 

sẽ thêm vào trước chuỗi 'prefix_' để mỗi phần tử

+8

Cảm ơn. Tôi đã thực sự tìm kiếm trước một chuỗi, vì vậy bổ sung '#' của bạn rất hữu ích đối với tôi. – guaka

+0

Điều này, ngắn gọn và chính xác, phải là câu trả lời được chấp nhận. Nó hoạt động với bất kỳ [thao tác chuỗi] nào (http://tldp.org/LDP/abs/html/string-manipulation.html) và áp dụng thao tác với từng phần tử mảng. – starfry

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