Làm thế nào để đếm chiều dài của một mảng được xác định trong bash?


58

Tôi mới sử dụng bash và không thể tìm thấy một hướng dẫn tốt để trả lời câu hỏi của tôi.

array=( item1 item2 item3)
for name in ${array[@]}; do
    echo current/total
    ... some other codes
done

Tôi muốn tính giá trị "hiện tại" và "tổng", vì sản lượng dự kiến ​​của việc này là:

1/3
2/3
3/3

Cảm ơn vì bất kỳ lời khuyên


Lưu ý rằng bạn nên đặt ${array[@]}trong dấu ngoặc kép. Nếu không, việc chia từ sẽ được thực hiện và bạn sẽ nhận được kết quả không mong muốn, trên các đầu vào như thế nào array=("item 1" "item 2" "item 3").
vườn

Câu trả lời:


102

Bạn có thể truy cập các chỉ mục mảng bằng cách sử dụng ${!array[@]}và độ dài của mảng bằng cách sử dụng ${#array[@]}, ví dụ:

#!/bin/bash

array=( item1 item2 item3 )
for index in ${!array[@]}; do
    echo $index/${#array[@]}
done

Lưu ý rằng vì các mảng bash không được lập chỉ mục , nên bạn thực sự sẽ nhận được:

0/3
1/3
2/3

Nếu bạn muốn số đếm chạy từ 1, bạn có thể thay thế $indexbằng $((index+1)). Nếu bạn muốn các giá trị cũng như các chỉ số bạn có thể sử dụng "${array[index]}"tức là

#!/bin/bash

array=( item1 item2 item3 )
for index in ${!array[@]}; do
    echo $((index+1))/${#array[@]} = "${array[index]}"
done

cho

1/3 = item1
2/3 = item2
3/3 = item3

Nếu tôi muốn nhận 1,2,3, tôi có thể làm điều này echo ($index+1)/${#array[@]}không?
AGamePlayer 28/03/2015

btw, có vẻ như bằng cách này tôi không thể nhận được item1, item2, item3 trong vòng lặp. Tôi vẫn còn mã khác để xử lý các mục item1, item2, item3. Cảm ơn,
AGamePlayer 28/03/2015

Xem bài chỉnh sửa.
Steeldo 28/03/2015

1

Một chỉ số 0 là hoàn toàn hợp lệ nếu bạn nghĩ rằng chỉ số thực sự là một phần từ địa chỉ cơ sở của một mảng. Đó là tiêu chuẩn trong thực tế, mặc dù nó thay đổi từ phương ngữ sang phương ngữ. Với ngôn ngữ Jovial cũ, [0]thực sự chứa kích thước tối đa của mảng. Vì vậy, nó bắt đầu với [1].

Với một số triển khai Cơ bản, bạn có thể tùy ý chọn để có 0hoặc 1là chỉ mục đầu tiên. Và ít nhất một Basic cho phép bạn chỉ định các mảng để lập chỉ mục [n]cho [m]. trong đó nmcó thể có bất kỳ giá trị nguyên nào, thậm chí âm, miễn nlà nhỏ hơn hoặc bằng m. Giá trị nchúng bị trừ đi từ [index]nhập, như index-n = 0thể chỉ số tương ứng với n.

Nhưng bạn có thể làm điều tương tự và nhiều hơn nữa trong mã của riêng bạn. Bạn thậm chí có thể đảo ngược thứ tự của một mảng theo cách này:

dim array(0, abs(m-n)); 
step=sign(m-n); 
if n > m then 
    base=m 
else 
    base=n; 
fi

Ví dụ mã này thực sự chỉ là một phần của một ngôn ngữ. Tôi chỉ muốn nó dễ đọc hơn. Biến bước được sử dụng để kiểm soát hướng rõ ràng mà bạn đang di chuyển theo hướng tích cực hay tiêu cực và được sử dụng để tính chỉ số hiệu quả khi đi vào hoặc đi ra khỏi mảng, thực sự luôn luôn dương từ đó [0].

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.