
Às vezes, gostaria de aplicar sinalizadores de expansão de parâmetro a uma string ou array literal em zsh. Como exemplo de caso de uso, digamos que eu queira dividir alguma string delimitada por vírgulas $arglist
em vírgulas, mas acrescentar algo antes. Seria bom poder fazer isso:
${(s/,/)arg1,arg2,$restofarglist}
É claro que existem outras maneiras de resolver esse problema específico, e sei que sempre posso atribuir primeiro um parâmetro e depois aplicar os sinalizadores. Mas a questão é: posso aplicar sinalizadores diretamente a um literal de alguma forma?
Responder1
Acho que você está procurando :-
substituição de parâmetro:
$ restofarglist='abc,def'
$ echo ${(s/,/)${:-arg1,arg2,$restofarglist}}
arg1 arg2 abc def
Do homem zsh:
${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.
Na verdade, você pode tornar este exemplo um pouco mais curto:
$ echo ${${:-arg1,arg2,$restofarglist}//,/ }
arg1 arg2 abc def