这是理解幕后情况的理论问题。
如果我这样做:
q=( 11 22 33 )
q="${q-()}"
declare -p q
它输出预期的:
declare -a p=([0]="11" [1]="22" [2]="33")
但如果我跑:
q=( 11 22 33 )
q="${q[@]-()}"
declare -p q
然后我明白了:
declare -a p=([0]="11 22 33" [1]="22" [2]="33")
我明白哪种方式是正确的,但我无法解释为什么后者产生它的结果。有人可以解释一下吗?
答案 0 :(得分:2)
分配给q
,当它已经设置了数组属性时,相当于分配给q[0]
。也就是说,你会得到与
q[0]="${q[@]-()}"
在您的第一个代码中,由于同样的原因,${q-()}
也会扩展为${q[0]-()}
,并且该值会重新分配回q[0]
,从而导致明显的无操作。 (在每种情况下,${...-()}
都与${...}
相同,因为您没有处理任何未设置的变量。)