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です(設定されていません)。