읽고 나서이 답변작성자: Kusalananda 변수 속성이 무엇인지에 대해 어느 정도 알고 있지만 변수 속성의 "이름 참조"(유형?)가 무엇인지, 그 목적이 무엇인지, 왜 bash 스크립트에서 사용되는지 누락되었습니다.
"이름 참조"(따옴표 제외)라는 용어를 인터넷 검색해 보았지만 해당 용어에 대한 위키 기사를 찾지 못했습니다.
답변1
예: 2회 통과분리기능할 배열.
#!/bin/bash
foo () {
declare -n array1="$1"
declare -n array2="$2"
echo 'The 1st array:'
printf '\t%s\n' "${array1[@]}"
echo 'The 2nd array:'
printf '\t%s\n' "${array2[@]}"
}
a=( 1 2 3 )
b=( a b c )
foo a b
시험:
$ bash script.sh
The 1st array:
1
2
3
The 2nd array:
a
b
c
이름으로 변수를 참조하지 않고 동일한 작업을 수행하는 것은 어려울 수 있으며 호출당 하나의 배열만 처리하도록 함수를 변경하거나 두 배열 각각의 요소 수를 추가 인수로 사용하거나 eval
특정 방법(올바르게 수행하기 어렵습니다).
함수에서 이름으로 변수를 참조하면 함수에 전달된(이름으로) 배열의 데이터를 사용하는 데 난해한 구문이 필요하지 않으며 함수는 일반 배열처럼 이름으로 변수를 참조할 수 있습니다.
함수 내에서 두 개의 변수 array1
와 참조, 즉 및 에서 이름으로 전달된 변수 array2
로 사용될 수 있습니다 . 그들은$1
$2
이름 참조.
나는 이것이 C++의 "참조에 의한 호출"과 유사하다고 생각하지만 호출자 측에서 사용되는 대신 &variable
(C++에서와 같이) 수신자는 지역 변수를 참조로 선언합니다.
답변2
일부 속성은 소위 변수와 유사합니다.유형다른 언어로. 이름 참조는 그러한 "유형" 중 하나입니다. 많은 언어의 참조와 마찬가지로 변수에 대한 액세스는 실제로 다른 변수(참조되는 변수)에 액세스합니다. 유일한 예외는 를 사용하여 declare -n
참조 변수를 설정하거나 declare -p
표시하는 경우입니다.
예를 들어
foo=123
declare -n ref=foo # set what 'ref' points to
ref=456 # set the value of 'foo'
echo "$foo $ref" # both are the value of 'foo'
인쇄됩니다 456 456
.
그러나 참조가 declare -p
표시 되며 변수에는 실제 값이 있습니다.ref
foo
foo
$ declare -p foo ref
declare -- foo="456"
declare -n ref="foo"