예 를 들어, 하나 이상의 다른 항목이 있을 수 있는 B2_...
일부 주제 관련 셸(환경 아님) 변수 이름을 확장해야 합니다....
ACCOUNT_ID
ACCOUNT_KEY
RESPOSITORY
얼마나 많은 변수가 있는지, 어떤 변수인지 모르겠습니다. 그것이 내가 알고 싶은 것입니다.
B2...
파일 이름을 확장하는 방법과 유사하게 각 개별 이름을 목록에 넣지 않고도 변수를 반복할 수 있기를 원합니다 .
대화형 세션에는 zsh를 사용하지만 sh 또는 bash 솔루션도 잘 작동합니다.
답변1
답변2
B2_
B2
이름이 로 시작하는 단일 변수를 사용하는 대신 연관 배열( )을 사용할 수 있습니다 . 예를 들어
참고: 다음은 에만 해당되며 zsh
연관 배열 ksh
도 bash
있지만 이를 초기화하고 사용하는 구문은 다릅니다(아래 참조).
typeset -A B2
# initialise array
B2=(ACCOUNT_ID 12345 ACCOUNT_KEY 54321 REPOSITORY somewhere)
# two different ways of adding elements to the array
B2[FOO]=bar
B2+=(NAME fred)
for key val in ${(kv)B2}; do
echo "$key: $val"
done
이 예제의 출력은 다음과 같습니다.
ACCOUNT_KEY: 54321
FOO: bar
REPOSITORY: somewhere
ACCOUNT_ID: 12345
NAME: fred
다음을 사용하여 전체 배열을 (스크립트나 명령줄에서 재사용하기에 적합한 형식으로) 인쇄할 수도 있습니다 typeset -p
.
% typeset -p B2
typeset -A B2=( ACCOUNT_ID 12345 ACCOUNT_KEY 54321 FOO bar NAME fred REPOSITORY somewhere )
또는 Bash에서의 동일한 작업 ksh
은 다음과 같습니다.
# initialise it
typeset -A B2
B2=([ACCOUNT_ID]=12345 [ACCOUNT_KEY]=54321 [REPOSITORY]=somewhere)
# add elements
B2[FOO]=bar
B2+=([NAME]=fred)
# get a list of the keys and use them as indexes to get the values
for key in "${!B2[@]}"; do
echo "$key: ${B2[$key]}"
done
# print the entire array
typeset -p B2
답변3
배쉬는 compgen -v
.
Bash에서는 다음으로 시작하는 변수 이름을 나열할 수 있습니다.B2
사용:
compgen -v B2
명령을 실행하면 다음에 입력할 때 자동 완성 결과로 사용할 수 있는 동일한 변수가 나열됩니다.compgen -v text
$
text
그런 다음 Tab 키를 누릅니다. (모든 항목을 표시하려면 Tab 키를 여러 번 눌러야 할 수도 있습니다.) compgen -v
대화형으로 사용할 수 있지만 스크립트에서 사용할 수도 있습니다. 예를 들어:
$ bash -c 'compgen -v SDK'
SDKMAN_CANDIDATES_DIR
SDKMAN_CURRENT_API
SDKMAN_DIR
SDKMAN_LEGACY_API
SDKMAN_PLATFORM
SDKMAN_VERSION
(물론 스크립트는 플래그의 피연산자 bash
로 전달되지 않고 파일에 위치할 수 있습니다.)-c
목적 compgen
은 명령을 완료하는 것입니다. help compgen
이에 대한 일반적인 정보는 출력(Bash)을 참조하세요. 이것이 귀하의 요구 사항을 충족할 수 있지만 다음의 매개 변수 확장 기술과 같은 다른 접근 방식을 찾을 수도 있습니다.길 퀴노(Gil Quinault)의 답변, 당신이 하고 있는 일을 더 명확하게 표현하세요. 개인의 취향이나 활동에 따라 다르기 때문에 어느 것이 더 좋다고 말씀드릴 수는 없습니다.
답변4
그리고 zsh
:
for var (${(M)${(k)parameters}:#B2_*})
printf '$%s == %s\n' $var ${(P)var}
${(k)parameters}
예열쇠$parameters
모든 매개변수에 대한 정보를 제공하는 특수 연관 배열입니다.${array:#B2_*}
삭제$array
확장 에서 일치하는 요소B2_*
.(M)
(패치된 경우 ) 에는M
반대가 적용됩니다.유지하다일치하는 요소.${(P)var}
bash
( 's 와 유사${!var}
): 이름이 저장된 매개변수의 값으로 확장됩니다$var
.
내보내지 않은 변수만 원하는 경우:
setopt extendedglob # for ^
for var (${(M)${(k)parameters[(R)^*export*]}:#B2_*})
printf '$%s == %s\n' $var ${(P)var}