Por que o zsh permite que o nome seja nulo em $ {name: -word}?

2

Em documentação do zsh :

${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.

Para que eu possa usar algo como:

$ printf '%s\n' ${:-123}
123

Gostaria de saber por que zsh permite isso e, nesse caso, é útil?

    
por cuonglm 26.01.2015 / 04:53

2 respostas

3

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á.

    
por 26.01.2015 / 05:57
3

Quando combinado com outros recursos de expansões de parâmetros, ele permite que você faça alguns truques inteligentes.

Alguns exemplos:

# strftime date via prompt sequences
tar -cpf ${(%):-%D{%Y%m%d}}-/etc.tar /etc
# brace expansion, but separated by commas via PE flags and nesting PEs.
print ${(j:,:)${:-{1..10}}}
    
por 26.01.2015 / 05:42