据我所知,${#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 中(我已经在bash
、ksh93
和中对其进行了测试pdksh
),${#array}
将给出 的长度${array[0]}
,并将${#array[@]}
给出数组中元素的数量。这是合乎逻辑的: 返回数组的"${array}"
元素并返回其长度。 0
"${#array}"