Um padrão de substituição de expansão de parâmetro zsh analisa a string de forma diferente se a entrada for uma variável em vez de embutida.
Eu suponho que tenha algo a ver com o escape do personagem, mas não tenho certeza de como contornar isso.
No código abaixo, >
, *
& 2.5.8
deve ser filtrado da saída printf, que ocorre na primeira expansão de parâmetro usando a variável versions
.
Mas quando a curl
chamada é embutida, os 3 valores acima não são filtrados.
Como posso inline a curl
chamada e ainda filtrar os 3 valores?
#!/usr/bin/env zsh
setopt EXTENDED_GLOB
# variable: 3 values are correctly filtered out
versions=$(curl '--silent' '--location' 'https://api.sdkman.io/2/candidates/groovy/darwin/versions/list?current=2.5.8&installed=2.5.8')
printf -- '%s\n' ${${(Z+n+)versions//[*+>][ *+>]# [[:graph:]]##}}
# inlined: 3 values are not filtered out
printf -- '%s\n' ${${(Z+n+)$(curl '--silent' '--location' 'https://api.sdkman.io/2/candidates/groovy/darwin/versions/list?current=2.5.8&installed=2.5.8')//[*+>][ *+>]# [[:graph:]]##}}
Cite a
$(command)
substituição:(Houve um extra desnecessário
${}
em torno do expn, que foi removido acima)zsh
Em um shell padrão , a expansão de parâmetros não precisa de aspas para evitar a divisão porIFS
(mas também não prejudicará). A substituição de comando sem aspas está sujeita a divisão porIFS
, portanto, a citação deve ser feita para evitar isso.O manual
zshexpn(1)
:Além disso, pode haver outras maneiras de remover essas strings, por exemplo
que pode ser usado com uma substituição de comando sem aspas:
O acima usa uma expansão de parâmetro no formato
${name:#pattern}
. O manual diz: