私が知る限り、の要素数を評価${#array[@]}
します。長い形式()を選択した理由はありますか?${#array}
$array
${#array[@]}
答え1
zshでは個人的な好みです。他のシェルでは、$array
最初の要素にのみ拡張できるため、最初の${#array}
要素の長さが出力されます。
したがって、シェル間でより多くの移植性が必要な場合は、それを指定することをお勧め[@]
します。
zshでは、引用符で囲まれているかどうかに応じて$array
同じ方法で拡張が行われます。$array[*]
二重引用符内にある場合、デフォルトでは空白の"$array"
最初の文字に展開され、区切ります。IFS
zsh% touch {1..10}; a=(*)
zsh% printf '<%s> ' $a
<1> <10> <2> <3> <4> <5> <6> <7> <8> <9>
zsh% printf '<%s> ' "$a"
<1 10 2 3 4 5 6 7 8 9>
zsh% IFS=:
zsh% print "$a"
1:10:2:3:4:5:6:7:8:9
zsh% print "$a[@]"
1 10 2 3 4 5 6 7 8 9
zsh% IFS=$' \t\n'
zsh% rm "$a"
rm: cannot remove ‘1 10 2 3 4 5 6 7 8 9’: No such file or directory
IFS
変更する必要がほとんどないので、初期の「個人的な好み」の応答が引き起こされました。しかし、明らかに言えば、flagsなしで2つを使用することにはいくつかの違いがあり、#
非常に微妙です。
$array[@]
また、引用符で囲まれているかどうかに応じて動作が変わらないので、これを好みます。要素に存在できるすべてのスペースと内部スペースは保持されます。
答え2
他のすべてと同様に、コードが読みやすく理解しやすくなるほど、他の人(または将来のあなた)がメンテナンスしやすくなります。選択肢があり、一方が不明な場合は別のものを選択してください。
さらに、シェルスクリプトを移植可能にするには、後者がbash
。
答え3
配列をサポートするほとんどのシェル(私はこれを、およびbash
でテストしました)で長さが提供され、配列の要素数が提供されます。これは論理的です。配列の要素を返し、その長さを返します。 ksh93
pdksh
${#array}
${array[0]}
${#array[@]}
"${array}"
0
"${#array}"