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(설정되지 않음)입니다.