예상 요소 수의 두 배로 배열 계산

예상 요소 수의 두 배로 배열 계산

bash요소 수 대신 배열의 단어 수를 계산하는 것처럼 보이는 이유는 무엇 입니까?

touch '1 red' '2 orange' '3 yellow'        # Three filenames, each of two words

files=( * )                                # Get the set of files
echo "#files is ${#files}"

for (( i=0; i <= ${#files}; i++ ))
do
    printf "%d\t%s\n" $i "${files[$i]}"
done

이 출력은 "잘못된" 것 같습니다. 우선, ${#files}포함은 5에 6개의 요소가 있음을 나타냅니다 ${files[@]}. 그러나 0및 요소에만 데이터가 포함 되어 1있으며 올바른 파일 이름이 포함되어 있습니다.2${files[@]}

#files is 5
0       1 red
1       2 orange
2       3 yellow
3
4
5

나는 6 ${files[@]}개의 단어 1, red, 2, orange, 3, 및 yellow, 또는 중 하나를 포함할 것으로 예상했습니다 . 이 혼합 시나리오는 아닙니다.${#files}2

누군가 나에게 이것을 설명해 줄 수 있습니까?

답변1

${#files}는 배열의 첫 번째 요소의 길이, 즉 의 길이입니다 1 red. 5개입니다.

~에서수동:

${#name[subscript]}는 ${name[subscript]}의 길이로 확장됩니다. 아래 첨자가 "@" 또는 "*"인 경우 배열의 요소 수로 확장됩니다. [...]
첨자 없이 배열 변수를 참조하는 것은 첨자 0이 있는 배열 변수를 참조하는 것과 같습니다.

따라서 ${#files}= ${#files[0]}. 그러나 ${#files[@]}or는 ${#files[*]}배열의 요소 수를 제공합니다.

(단어수와는 관계없으나 ${files[*]}따옴표 없이 확장하면 모든 값에 대해 일반적인 단어 분할이 이루어집니다.)

답변2

${#files}"다음으로 변경하세요 .${#files[@]}"

${#files}"이것이 첫 번째 파일이기 때문에 5개를 얻게 됩니다 .
와 동일하며 ${files[0]}"1 red"로 명명됩니다.
저것5개의 문자가 포함되어 있습니다.

동일한 문제의 경우 루프가 실패하고 1에서 5까지 반복됩니다.
그러나 요소 3, 4, 5는 단지 null(설정되지 않음)입니다.

관련 정보