Шаблон замены расширения параметра 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:]]##}}
решение1
Цитата $(command)
замены:
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:]]##}
(Был один лишний ненужный символ ${}
около expn, который удален выше)
В zsh
оболочке по умолчаниюрасширение параметране нуждается в кавычках, чтобы избежать разделения IFS
(но и не повредит).замена командыможет быть разбито на IFS
, поэтому необходимо использовать кавычки, чтобы избежать этого.
Руководство zshexpn(1)
:
PARAMETER EXPANSION
Обратите внимание, в частности, на тот факт, что слова параметров без кавычек не разбиваются автоматически по пробелам, если не
SH_WORD_SPLIT
установлена эта опция; см. ссылки на эту опцию ниже для получения более подробной информации. Это важное отличие от других оболочек. Однако, как и в других оболочках, пустые слова исключаются из расширений параметров без кавычек.
COMMAND SUBSTITUTION
Если подстановка не заключена в двойные кавычки, вывод разбивается на слова с использованием
IFS
параметра.
Кроме того, могут быть и другие способы удаления этих строк, например:
printf -- '%s\n' ${${=versions}:#([*+>-]|2.5.8)}
который можно использовать с заменой команд без кавычек:
printf -- '%s\n' ${$(curl '--silent' '--location' 'https://api.sdkman.io/2/candi'\
'dates/groovy/darwin/versions/list?current=2.5.8&installed=2.5.8'):#([*+>-]|2.5.8)}
Вышеприведенное использует расширение параметра в форме ${name:#pattern}
. В руководстве говорится:
${name:#pattern}
Если шаблон соответствует значению name, то подставьте пустую строку; в противном случае просто подставьте значение name. Если name — массив, соответствующие элементы массива удаляются (используйте флаг(M)
для удаления несоответствующих элементов).