From zsh documentation:${name-word}${name:-word}If name is set, or in the second form is non-null, then substitute its  value; otherwise substitute word. In the second form name may be  omitted, in which case word is always substituted.So I can use something like:$ printf '%s\n' ${:-123}123I wonder why zsh allow this and in which case it's useful?
Why does zsh allow name to be null in ${name:-word}?
zsh;variable substitution
I don't have an explanation for why they did it this way, but ${:-foo...} does have an application: it counts as a parameter substitution in places that syntactically require one, but always just expands to a literal you give. You can write things like this to use expansion flags or other expansion specifiers on a literal string in-place:$ echo ${(#)${=${:-65 66 67}}}A B C$ echo ${(q)${:-hello world!}}hello\ world\!You can also use other expansions inside your word string:$ restofarglist=arg3,arg4$ echo ${${:-arg1,arg2,$restofarglist}//,/ }All of this behaviour is documented right at the end of the section on parameter expansion: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.You can nest these expansions arbitrarily deeply, although they become incomprehensible fairly quickly. There are strange corner cases around using the ${name=word} family of expansions inside either side.It's a pretty obtuse way of doing things in general, but it's both the only application I know of for ${:-} and the only way to make these things happen without creating another variable. The documentation could definitely be clearer, even though all the bits are technically there.