와일드카드 셸 변수 이름

와일드카드 셸 변수 이름

예 를 들어, 하나 이상의 다른 항목이 있을 수 있는 B2_...일부 주제 관련 셸(환경 아님) 변수 이름을 확장해야 합니다....ACCOUNT_IDACCOUNT_KEYRESPOSITORY

얼마나 많은 변수가 있는지, 어떤 변수인지 모르겠습니다. 그것이 내가 알고 싶은 것입니다.

B2...파일 이름을 확장하는 방법과 유사하게 각 개별 이름을 목록에 넣지 않고도 변수를 반복할 수 있기를 원합니다 .

대화형 세션에는 zsh를 사용하지만 sh 또는 bash 솔루션도 잘 작동합니다.

답변1

사용 매개변수 확장:

$ foobar_1=x foobar_2=y foobar_3=z
$ for v in "${!foobar_@}"; do echo "$v"; done

산출:

foobar_1
foobar_2
foobar_3

'역참조':

$ for v in "${!foobar_@}"; do echo "${!v}"; done

출력²:

x
y
z

답변2

B2_B2이름이 로 시작하는 단일 변수를 사용하는 대신 연관 배열( )을 사용할 수 있습니다 . 예를 들어

참고: 다음은 에만 해당되며 zsh연관 배열 kshbash있지만 이를 초기화하고 사용하는 구문은 다릅니다(아래 참조).

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}

관련 정보