${#array}と${#array[@]}

${#array}と${#array[@]}

私が知る限り、の要素数を評価${#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でテストしました)で長さが提供され、配列の要素数が提供されます。これは論理的です。配列の要素を返し、その長さを返します。 ksh93pdksh${#array}${array[0]}${#array[@]}"${array}"0"${#array}"

関連情報