如果输入是变量而不是内联,则 zsh 参数扩展替换模式会以不同方式解析字符串。
我认为它与字符转义有关,但我不确定如何解决它。
在下面的代码中,>
应该从 printf 输出中过滤掉, *
& ,这发生在使用变量 的第一个参数扩展中。2.5.8
versions
但是当curl
调用被内联时,上面的 3 个值并没有被过滤掉。
如何内联curl
调用但仍过滤掉 3 个值?
#!/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:]]##}}
引用
$(command)
替换:${}
( expn周围有一个额外的不必要的,上面删除了)在默认
zsh
shell 中,参数扩展不需要引用以避免拆分IFS
(但它也不会受到伤害)。未引用的命令替换会被 分割IFS
,因此必须进行引用以避免这种情况。手册
zshexpn(1)
:此外,可能还有其他方法可以删除这些字符串,例如
可以与不带引号的命令替换一起使用:
上面使用了形式的参数展开
${name:#pattern}
。手册说: