[unix] bash에 정의 된 배열의 길이를 계산하는 방법은 무엇입니까?

나는 bash를 처음 접했고 내 질문에 대답하는 좋은 자습서를 찾을 수 없습니다.

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

“현재”및 “총”값을 예상 출력으로 계산하려고합니다.

1/3
2/3
3/3

모든 종류의 팁에 감사드립니다



답변

다음을 사용하여 배열 색인에 액세스하고 다음을 사용하여 배열 ${!array[@]}의 길이에 액세스 할 수 있습니다 ${#array[@]}.

#!/bin/bash

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

bash 배열은 인덱스0이므로 실제로 다음을 얻을 수 있습니다.

0/3
1/3
2/3

당신은 카운트가 1에서 실행하려는 경우 당신은 대체 할 수 있습니다 $index$((index+1)). 당신이 원하는 경우 뿐만 아니라 인덱스를 당신이 사용할 수있는 "${array[index]}"

#!/bin/bash

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

기부

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


답변

인덱스가 실제로 배열의 기본 주소에서 오프셋 된 것으로 생각하면 인덱스 0은 완벽하게 유효합니다 . 그것은 방언에 따라 다르지만 실제로는 표준입니다. 이전 Jovial 언어에서는 [0]실제로 최대 배열 크기가 포함되었습니다. 그래서 시작했습니다 [1].

일부 기본 구현에서는 임의로 0또는 1첫 번째 인덱스 를 갖도록 선택할 수 있습니다 . 적어도 하나의 Basic을 사용하면 fron [n]을 색인화 할 배열을 지정할 수 있습니다 [m]. where n및 보다 작거나 같은 m정수 값 (음수)도 가질 수 있습니다 . index에 해당하는 것처럼 입력 한 값에서 값 이 빼집니다 .nmn[index]index-n = 0n

그러나 자신의 코드에서 똑같은 일을 더 많이 할 수 있습니다. 이런 식으로 배열의 순서를 바꿀 수도 있습니다.

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

이 코드 예제는 실제로는 한 언어의 일부일뿐입니다. 나는 그것이 더 읽기 쉽기를 바랐다. step 변수는 양수 또는 음수로 이동하는 겉보기 방향을 제어하는 ​​데 사용되며, 배열에 들어 오거나 나올 때 유효 인덱스를 계산하는 데 사용되며 실제로는 항상 양수입니다 [0].


답변