TL;박사:zsh
Ksh/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*}