"이름 참조" 변수 속성이란 무엇입니까? [복사]

"이름 참조" 변수 속성이란 무엇입니까? [복사]

읽고 나서이 답변작성자: 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표시 되며 변수에는 실제 값이 있습니다.reffoofoo

$ declare -p foo ref
declare -- foo="456"
declare -n ref="foo"                   

관련 정보