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

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

据我所知,${#array[@]}${#array}评估 中的元素数量$array。有什么理由选择较长的形式 ( ${#array[@]}) 吗?

答案1

在zsh中,个人喜好。在其他 shell 中$array可能只扩展到第一个元素,因此${#array}会输出第一个元素的长度。

因此,如果您希望在 shell 之间具有更多的可移植性,那么指定[@]就可以了。

在 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很少需要改变,这促使我最初的“个人喜好”回应。但只是澄清一下,在没有标志的情况下使用两者之间存在一些差异#,它们非常微妙。

$array[@]也更喜欢,因为它的行为不会根据它是否出现在引号中而改变。元素可能具有的空白和内部空白将被保留。

答案2

与任何事情一样,您的代码越具有可读性和易理解性,其他人(或未来的您)就越容易维护。当你有选择并且其中一个不明确时,选择另一个。

此外,如果您希望 shell 脚本具有可移植性,那么后者是唯一可以在bash.

答案3

在大多数支持数组的 shell 中(我已经在bashksh93和中对其进行了测试pdksh),${#array}将给出 的长度${array[0]},并将${#array[@]}给出数组中元素的数量。这是合乎逻辑的: 返回数组的"${array}"元素并返回其长度。 0"${#array}"

相关内容