![${!i}를 어떻게 구문 분석하나요(그리고 그 의미는 무엇인가요)? [복사]](https://linux55.com/image/104085/%24%7B!i%7D%EB%A5%BC%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EA%B5%AC%EB%AC%B8%20%EB%B6%84%EC%84%9D%ED%95%98%EB%82%98%EC%9A%94(%EA%B7%B8%EB%A6%AC%EA%B3%A0%20%EA%B7%B8%20%EC%9D%98%EB%AF%B8%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94)%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
for 루프 본문에서 ${!i}
다음 형식을 발견했습니다.
for ((i=$#; i>0; i--)); do
# ...
if <SOME_TEST>; then
# ...
accumulator="${!i}:${accumulator}"
# ...
fi
# ...
done
${!i}
이러한 가능한 값 범위를 고려할 때 이는 " i
첫 번째 위치 인수로 확장" 을 의미하는 것 같습니다 .
어쨌든, 나는 이 상징에 대해 더 알고 싶습니다. (특히 ${!i}
특별한 경우 인지 $@
, 아니면 어떤 배열에도 적용되는 구문의 특정 인스턴스인지? 그래서 표현식이 어떻게 구문 분석되는지 궁금합니다.)
그러나 이 기호에 대한 문서를 찾을 수 없습니다. bash
이 시퀀스에 대한 매뉴얼 페이지를 검색 하면 ${!
다음 문자열만 찾습니다.
${!name[@]}
${!name[*]}
${!prefix*}
${!prefix@}
...그리고 이러한 이벤트와 관련된 문서를 제가 혼동하고 있는 코드와 일치시킬 수 없습니다.
(실제로 가능하다면 답변에 관련 문서를 인용하여 제가 놓친 이유를 알아낼 수 있도록 해주세요.)
편집: 원본 게시물의 경우 for
원본 코드에서 잘못된 줄을 복사했습니다. 이제 고쳤습니다. (설명은 동일하지만.)
답변1
당신의 가정은 정확합니다.
더 자세한 문서는 다음 위치에 숨겨져 있습니다 info bash
.
3.5.3 쉘 매개변수 확장
[...]
매개변수 확장의 기본 형태는 입니다
${PARAMETER}
. 값이PARAMETER
대체됩니다. 이는PARAMETER
위에 설명된 대로 셸 매개변수(*note ShellParameters::) 또는 배열 참조(*note Arrays::)입니다.PARAMETER
위치 인수에 두 개 이상의 숫자가 있거나 이름의 일부로 해석되지 않는 문자가 뒤에 오는 경우PARAMETER
중괄호가 필요합니다 .의 첫 번째 문자가
PARAMETER
느낌표(!
)이고PARAMETER
NAMEREF가 아닌 경우 1단계 변수 간접 지정을 도입합니다.. Bash는 나머지에서 형성된 변수 값을PARAMETER
변수 이름으로 사용한 다음 변수를 확장하고PARAMETER
자체 값이 아닌 나머지 대체에서 해당 값을 사용합니다. 이를 "간접 확장"이라고 합니다. nameref의 경우 전체 간접 확장을 수행하는 대신PARAMETER
참조된 변수의 이름을 확장합니다 .PARAMETER
아래에 설명된 확장은 예외입니다${!PREFIX*}
.${!NAME[@]}
느낌표는 간접적인 관계를 소개하기 위해 여는 중괄호 바로 뒤에 와야 합니다.
귀하의 편의를 위해 문서의 이 섹션을 찾을 수 있습니다.GNU.org 문서 사이트에서또한.