Aplicar sinalizadores de expansão de parâmetro a string ou array literal em zsh

Aplicar sinalizadores de expansão de parâmetro a string ou array literal em zsh

À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 $arglistem 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

informação relacionada