for 루프의 쉘 변수

for 루프의 쉘 변수

나는 이 구절을 넘기는 데 어려움을 겪었다 man bash.

루프의 제어 변수에 fornameref속성이 있으면 단어 목록은 쉘 변수 목록이 될 수 있으며 루프가 실행될 때 목록의 각 단어에 대해 이름 참조가 설정됩니다.

배열 변수에는 속성을 할당할 수 없습니다 -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은 을 가리키는 변수에 영향을 주지만 reffor 루프는 참조를 따라 가리키는 변수를 변경하는 대신 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

관련 정보