접두사와 일치하는 변수 이름을 확장하는 zsh 구문

접두사와 일치하는 변수 이름을 확장하는 zsh 구문

TL;박사:zshKsh/Bash에 상응하는 확장이 있습니까 "${!varnamepfx@}"?

예를 들어, 다음과 같은 변수가 있는 경우 set:

[...]
foo='random value'
bar=$'amazing\n value'
baz='that other value'
[...]

그런 다음 printf -- %s\\n "${!ba@}"Bash에서 요청하면 다음을 얻습니다.

bar
baz

나는 읽고 있었다zsh수동하지만할 수 없었다도착하다무엇이든 찾아보세요구문은 위와 같이 간단합니다. 내가 취할 수 있는 최선의 접근 방식은 다음과 같은 중첩 확장입니다.

(위의 예의 경우)

printf -- %s\\n "${(M)${${(f)$(set)}[@]%%=*}[@]:#ba*}"

작업을 안정적으로 수행하는 것처럼 보이지만(적어도 MacOS Catalina의 zsh v5.3에서는) 다소 복잡해 보이며 $(set)명령 대체가 실제로 프로세스를 생성하는지 아니면 zsh.

물론, 지금까지 나는 완성 시스템을 통해 이 작업을 수행하는 것을 배제했습니다(따라서 고려하지도 않았습니다). 왜냐하면 그러한 간단한 작업에는 약간 과도한 것처럼 보이기 때문입니다.

답변1

키를 일치시키는 또 다른 옵션$parameter특수 연관 배열사용하는 것입니다I 아래 첨자 기호:

$ print -rC1 - $parameters[(I)ba*]
bar
baz

그건연관 배열연산자는 목록/배열을 생성하고 @Gille ${(kM)parameters:#ba*}목록/배열 연산자연관 배열에 적용된 키도 목록/배열을 생성합니다. 이 경우 최종 결과는 본질적으로 동일합니다.

하나만 기억하면 되는 경우에는 ${(M)array:#pattern}-for grep-arrays가 더 일반적이므로 더 유용합니다. 그것과 비교할 수 없는 것배열 아래 첨자 플래그키와 일치하여 해당 값을 반환하거나 값과 일치하여 해당 키를 반환합니다.

다음과 같이 두 가지를 결합할 수 있습니다.

$ print -rC1 - ${(Mk)parameters[(R)array*]:#pa*}
path
patchars

pa다음은 (로 시작하는 배열의 이름을 반환합니다.가치$parameters일치하는 항목 중 및array*열쇠) 에 반대합니다 pa*.

물론 모든 zsh자체 검사 변수( $aliases, $commands, $functions, $builtins, $modules, ...)에 대해 $history이 작업을 수행 할 수 있습니다.

-m pattern그 중 일부의 경우 해당 내장 함수( whence -m, alias -m, autoload -m, ...) fc -m의 (일치) 옵션을 사용하여 쿼리 할 수도 있지만 bash의 경우와 마찬가지로 compgen출력이 행이므로 안정적으로 후처리할 수 없습니다. based 이며 보고된 내용 중 일부에는 개행 문자가 포함될 수 있습니다.

답변2

Zsh에는 변수 이름을 필터링하기 위한 특별한 구문이 없습니다. 그냥 결합하세요parameters연관 배열그리고매개변수 확장 기능: ${(k)…}키(예: 매개변수 이름)를 가져오고, ${…:#…}패턴을 기반으로 필터링하고, ${(M)…}일치 항목을 제거하는 대신 유지합니다.

printf '%s\n' ${(kM)parameters:#ba*}

관련 정보