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

kjo*_*kjo 6 scripting zsh array shell-script

据我所知,${#array[@]}${#array}评估$array. 是否有任何理由更喜欢较长的形式 ( ${#array[@]})?

llu*_*lua 10

在zsh中,个人喜好。在其他壳中$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
Run Code Online (Sandbox Code Playgroud)

IFS很少需要改变,这促使我最初的“个人偏好”回应。但是只是为了澄清在没有#标志的情况下使用时两者之间存在一些差异,它们只是非常微妙。

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