간접 확장이란 무엇입니까? $ {! var *}는 무엇을 의미합니까?


85

" 초보자를위한 Bash 가이드 "를 읽고 있습니다. 그것은 말한다 :

의 첫 번째 문자 PARAMETER가 느낌표 인 경우 Bash는 나머지에서 형성된 변수의 값을 변수 PARAMETER이름으로 사용합니다. 그런 다음이 변수가 확장되고 해당 값이 PARAMETER자체 값이 아닌 나머지 대체에서 사용 됩니다. 이를 간접 확장이라고합니다.

주어진 예는 다음과 같습니다.

franky ~> echo ${!N*}
NNTPPORT NNTPSERVER NPX_PLUGIN_PATH

나는 여기서 잘 이해하지 못한다.

나머지에서 형성된 변수의 값 PARAMETER

PARAMETER그냥 !N*다음

나머지 PARAMETER

입니다 N*. 이것이 어떻게 변수를 형성 할 수 있습니까? Bash가 가능한 모든 명령을 검색 했습니까?

답변:


110

bash매뉴얼 페이지 를 읽으면 기본적으로 진술 한 내용을 확인합니다.

매개 변수의 첫 번째 문자가 느낌표 ( !)이면 변수 간접 레벨이 도입됩니다. Bash는 나머지 매개 변수에서 형성된 변수의 값을 변수 이름으로 사용합니다. 그런 다음이 변수가 확장되고 해당 값이 매개 변수 자체의 값이 아닌 나머지 대체에서 사용됩니다. 이를 간접 확장이라고합니다.

그러나 거기에서 읽기 :

이에 대한 예외의 확장입니다 ${!prefix*}${!name[@]}아래에 설명.

${!prefix*}접두사와 일치하는 이름입니다. 이름이 접두사로 시작하고 IFS특수 변수 의 첫 문자로 구분 된 변수 이름으로 확장됩니다 .

즉, 특정 예 ${!N*}는 인용 한 규칙에 대한 예외 입니다. 그것은 않습니다 , 그러나, 작업 등 예상되는 경우에 광고로 :

$ export xyzzy=plugh ; export plugh=cave

$ echo ${xyzzy}  # normal, xyzzy to plugh
plugh

$ echo ${!xyzzy} # indirection, xyzzy to plugh to cave
cave

1
답변 해주셔서 감사합니다. "초보자를위한 배쉬 가이드"를 읽을수록 저자가 자신이 쓴 내용을 이해하고 있는지 스스로에게 더 많이 묻습니다.
LRDPRDX

23

*여기 에서처럼 주어진 "간접" 이로 끝나는 경우 예외가있는 것 같습니다. 이 경우 지정한 부분으로 시작하는 모든 변수 이름 (N 여기)으로 . Bash는 변수를 추적하고 어떤 것이 존재하는지 알고 있기 때문에 그렇게 할 수 있습니다.

진정한 간접적 방법은 다음과 같습니다.
변수가로 $VARIABLE설정되어 42있고 다른 변수가로 $NAME설정되어 있다고 가정 VARIABLE합니다. ${!NAME}나에게 줄 것이다 42. 한 변수의 값을 사용하여 다른 변수의 이름을 알려줍니다.

$ NAME="VARIABLE"
$ VARIABLE=42
$ echo ${!NAME}
42

5
와우, 삶의 의미, 우주 및 모든 것에 대한 답을 얻는 것이 너무 쉽다는 것을 누가 알았습니까!
KomodoDave 2014 년

3

예,! 다음에 가능한 모든 변수 확장을 검색합니다. 수행 한 경우 :

echo ${!NP*}

당신은 얻을 것 NPX_PLUGIN_PATH입니다.

다음 예를 고려하십시오.

:~> export myVar="hi"
:~> echo ${!my*}
    myVar
:~> export ${!my*}="bye"
:~> echo $myVar
    bye

my *와 일치하는 다른 변수도 "bye"로 설정됩니까?
Anthony

1
@Anthony 나는 그것을 시도하고 ${!my*}myA, myB로 확장하면 myA는 현재 값으로 내보내지고 myB는 "bye"로 설정되어 내보내집니다. 별로 유용하지 않습니다.
GKFX

3

간접 처리에서 예외가 발생했습니다. 마지막 문자가 *이면 이전에 주어진 접두사가있는 모든 변수가 반환됩니다.


그래서 *사건을 제외하고 이것은 다음과 같 ${${VAR}}습니까?
chronospoon 2014 년

1
@chronospoon,, ${${VAR}}보다 짧게 쓸 수있는 ${$VAR},는 부호를 $VAR따를 수없는 문자열을 반환하기 때문에 합법적 이지 않습니다 $. 문자열을 변수 이름으로 사용하려면 한 수준의 간접적 (원래 질문 자체에서 인용)을 도입해야합니다. ${!VAR} ,를 사용할 수 있습니다 . 이는 예상 할 수있는 (잘못하지만 이해할 수있는) 작업을 ${$VAR}수행합니다.
엔리코

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.