간접 확장이란 무엇입니까?${!var*}의 의미는 무엇입니까?
저는 '초보자용 배쉬 가이드'를 읽고 있어요.다음과 같이 되어 있습니다.
의 첫 번째 문자가
PARAMETER
느낌표입니다.Bash는 나머지 변수 값을 사용합니다.PARAMETER
변수 이름으로, 이 변수가 확장되고 해당 값이 치환의 나머지 부분에서 사용됩니다.PARAMETER
그 자체입니다.이를 간접 확장이라고 합니다.
다음은 예를 제시하겠습니다.
franky ~> echo ${!N*} NNTPPORT NNTPSERVER NPX_PLUGIN_PATH
무슨 말인지 잘 모르겠어요.
나머지로부터 형성되는 변수의 값
PARAMETER
처럼PARAMETER
그냥!N*
,그리고나서
나머지
PARAMETER
그냥N*
어떻게 이것이 변수를 형성할 수 있었을까?Bash가 가능한 모든 명령어를 검색했습니까?
를 읽어보시면bash
man 페이지는 기본적으로 당신이 말한 것을 확인합니다.
파라미터의 첫 번째 문자가 느낌표인 경우(
!
)의 변수 간접 레벨이 도입되었습니다.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
특정 '다이렉션'이 다음과 같이 끝나는 경우 예외가 있을 수 있습니다.*
여기처럼요.이 경우 지정한 부품으로 시작하는 모든 변수 이름이 표시됩니다( ).N
여기서) Bash는 변수를 추적하고 어떤 변수가 존재하는지 알기 때문에 이 작업을 수행할 수 있습니다.
진정한 간접은 다음과 같습니다.
변수가 있다고 가정합니다.$VARIABLE
로 설정하다.42
다른 변수가 있습니다.$NAME
로 설정하다.VARIABLE
.${!NAME}
나에게 줄 것이다42
. 한 변수의 값을 사용하여 다른 변수의 이름을 알 수 있습니다.
$ NAME="VARIABLE"
$ VARIABLE=42
$ echo ${!NAME}
42
bash indirection 및/또는 nameref
이 질문에 늦게 답변하고 nameref에 대해 알려주지 않았기 때문에...
「」를 사용합니다.${!var}
indirection 구문:
~$ someVariable='Some content'
~$ var=someVariable
~$ echo $var
someVariable
~$ echo ${!var}
Some content
namref 사용(declare -n
의 구문)의 설명
nameref 를 사용하면 변수의 내용을 표시할 수 있을 뿐만 아니라 변수를 채우고 속성을 가져오거나 설정할 수 있습니다.
~$ someVariable='Some content'
~$ declare -n var=someVariable
~$ echo $var
Some content
다음 구문은 함수에 도움이 됩니다.
function showVarDetail() {
local -n var=$1
printf 'Variable \47\44%s\47 is %d len, has [%s] flags and contain: %q\n' \
"$1" "${#var}" "${var@a}" "$var"
}
(주의: 이 함수는 샘플에 불과합니다.이렇게 하면 어레이 및 관련 어레이가 올바르게 확장되지 않습니다.
그리고나서
~$ someVar='Hello world!'
~$ showVarDetail someVar
Variable '$someVar' is 12 len, has [] flags and contain: Hello\ world\!
~$ declare -r PI=3.14159265358979323844
~$ showVarDetail PI
Variable '$PI' is 22 len, has [r] flags and contain: 3.14159265358979323844
nameref를 사용하여 변수 값 채우기
두 가지 모두 효과가 있을 수 있습니다!
다음으로 2개의 변수 이름을 인수로 실행할 수 있는 함수의 예를 나타냅니다.첫 번째 변수는 문자열을 포함해야 하며 두 번째 변수는 첫 번째 변수 콘텐츠의 첫 번째 문자로 채워진 다음 첫 번째 변수 콘텐츠는 한 글자씩 이동합니다.
shift1char <variable string source> <variable target>
shift1char () {
local -n srcStr=$1 tgtVar=$2;
tgtVar=${srcStr::1} srcStr=${srcStr:1}
}
그리고나서
~$ someVar='Hello world!'
~$ shift1char someVar someChar
~$ showVarDetail someVar
Variable '$someVar' is 11 len, has [] flags and contain: ello\ world\!
~$ showVarDetail someChar
Variable '$someChar' is 1 len, has [] flags and contain: H
예, ! 뒤에 가능한 모든 변수 확장을 검색합니다.실행한 경우:
echo ${!NP*}
하면 '아까부터'밖에 안 나와요.NPX_PLUGIN_PATH
다음 예를 생각해 보겠습니다.
:~> export myVar="hi"
:~> echo ${!my*}
myVar
:~> export ${!my*}="bye"
:~> echo $myVar
bye
간접 처리에서 예외가 발생했습니다. 마지막 문자가 다음과 같은 경우*
앞에 지정된 프레픽스를 가진 모든 변수가 반환됩니다.
신뢰할 수 있는 정보에 대해서는, 이 GNU 문서를 참조해 주세요.
으로는 간접 확장은 .${!prefix*}
예외의 1개로서 이 예에서는 N이 프리픽스입니다.
이 문서에서는 bash에서의 간접 확장이 무엇인지 설명합니다.
언급URL : https://stackoverflow.com/questions/8515411/what-is-indirect-expansion-what-does-var-mean
'sourcecode' 카테고리의 다른 글
WPF에서 GridViewColumn 데이터를 자동 조정하고 오른쪽 정렬하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
---|---|
텍스트 블록을 WPF ListBox로 강제 랩하다 (0) | 2023.04.14 |
Linux, DST-safe에서 bash로 어제 날짜 가져오기 (0) | 2023.04.14 |
새로운 행의 패턴을 grep로 지정하는 방법은 무엇입니까? (0) | 2023.04.14 |
XAML에서 이미지 리소스를 참조하는 방법 (0) | 2023.04.14 |