나는 이 구절을 넘기는 데 어려움을 겪었다 man bash
.
루프의 제어 변수에
for
이nameref
속성이 있으면 단어 목록은 쉘 변수 목록이 될 수 있으며 루프가 실행될 때 목록의 각 단어에 대해 이름 참조가 설정됩니다.배열 변수에는 속성을 할당할 수 없습니다
-n
. 그러나nameref
변수는 배열 변수와 첨자 배열 변수를 참조할 수 있습니다.
nameref
루프에서 이 변수의 예를 제시하고 설명을 제공할 수 있습니까?
답변1
nameref 변수는 "일반" 변수에 대한 것이며 일반 파일에 대한 심볼릭 링크는 무엇입니까?
$ typeset -n ref=actual; ref=foo; echo "$actual"
foo
for 루프는 목록의 각 단어에 차례로 바인딩된 루프 변수("제어 변수")를 사용하여 루프의 본문을 실행합니다.
$ for x in one two three; do echo "$x"; done
one
two
three
이는 연속 할당을 작성하는 것과 동일합니다.
x=one; echo "$x"
x=two; echo "$x"
x=three; echo "$x"
루프 변수가 nameref인 경우 nameref를 사용하여 단어 목록의 각 요소에 대해 본문이 차례로 실행됩니다. 이는 위의 일련의 할당과 동일하지 않습니다. is a nameref ref=value
할당 ref
은 을 가리키는 변수에 영향을 주지만 ref
for 루프는 참조를 따라 가리키는 변수를 변경하는 대신 nameref가 가리키는 위치를 변경합니다.
$ original=0; one=1; two=2; three=3
$ typeset -n ref=original
$ echo $ref
0
$ for ref in one two three; do echo "$ref"; done
1
2
3
$ echo original
0
루프 변수에 할당하는 경우 할당을 통한 간접 주소 지정도 관찰할 수 있습니다(흔하지 않지만 허용됨).
$ one=1; two=2; three=3
$ typeset -n ref
$ for ref in one two three; do echo ref=$((ref+10)); done
$ echo "$one $two $three"
11 12 13
마지막 문장에서는 nameref의 대상이 배열이 될 수 있음을 설명합니다. nameref 자체는 배열이 아니며 여전히 스칼라 변수이지만 할당 또는 역참조에 사용되면 가리키는 변수의 유형처럼 동작합니다.
$ a=(0 1 2)
$ typeset -n ref=a
$ ref[1]=changed
$ echo "${a[@]}"
0 changed 2