Eu não tenho uma explicação para por que eles fizeram desta forma, mas ${:-foo...}
tem um aplicativo: ele conta como uma substituição de parâmetro em lugares que exigem sintaticamente um, mas sempre apenas se expande para um literal que você dá. Você pode escrever coisas assim para usar sinalizadores de expansão ou other especificadores de expansão em uma string literal no local:
$ echo ${(#)${=${:-65 66 67}}}
A B C
$ echo ${(q)${:-hello world!}}
hello\ world\!
Você também pode usar outras expansões dentro da sua string word
:
$ restofarglist=arg3,arg4
$ echo ${${:-arg1,arg2,$restofarglist}//,/ }
Todo esse comportamento está documentado no final da seção sobre expansão de parâmetro :
If a
${...}
type parameter expression or a$(...)
type command substitution is used in place of name above, it is expanded first and the result is used as if it were the value of name.
Você pode aninhar essas expansões arbitrariamente profundamente, embora elas se tornem incompreensíveis rapidamente. Existem casos estranhos em torno de usar a família de expansões ${name=word}
em ambos os lados.
É uma maneira bastante obtusa de fazer as coisas em geral, mas é o único aplicativo que eu conheço para ${:-}
e a única maneira de fazer essas coisas acontecerem sem criar outra variável. A documentação poderia definitivamente ser mais clara, apesar de todos os bits estarem tecnicamente lá.