test -R 쉘 변수 VAR이 설정되어 있고 이름 참조인 경우 참입니다.

test -R 쉘 변수 VAR이 설정되어 있고 이름 참조인 경우 참입니다.

먼저 내가 따라가이 답변그런 다음 test -v검색합니다.https://linuxcommand.org/lc3_man_pages/testth.html옵션 이 있음을 나타냅니다 R.
test -R이름 선호도와 관련이 있는 것 같습니다.
그런 다음 검색합니다.이름 참조, 그러다가 찾았어요"이름 참조" 변수 속성이란 무엇입니까? 그런데 아직도 **명명된 참조**가 무엇을 의미하는지 잘 모르겠습니다.

array1=([11]="triage" 51=["trajectory"] 129=["dynamic law"])

for i in 10 11 12 30 {50..51} {128..130}; do
        if [ -v 'array1[i]' ]; then
                echo "Variable 'array1[$i]' is defined"
        else 
                echo "Variable 'array1[$i]' not exist"
        fi
done
declare -n array1=$1
printf '\t%s\n' "${array1[@]}"

if [ -R 'array1' ]; then
        echo "Yes"
        else echo "no" 
fi

마지막 if 블록이 를 반환하므로 no이는 이름 참조가 아님을 의미합니다. 그럼 위의 코드 블록을 기반으로 시연하는 방법은 무엇입니까?명명 참조

답변1

"이름 참조" 변수는 이름으로 다른 변수를 참조하는 변수입니다.

$ foo='hello world'
$ declare -n bar=foo
$ echo "$bar"
hello world
$ bar='goodbye'
$ echo "$foo"
goodbye
$ [[ -R foo ]] && echo nameref
$ [[ -R bar ]] && echo nameref
nameref

위의 예에서 변수는 foo일반 변수 bar이지만 이름은 변수를 지칭하는 변수를 의미합니다 foo. 액세스 값 $bar액세스 $foo및 설정이 bar설정됩니다 foo.

이름 참조는 배열을 함수에 전달할 때와 같이 다양한 방식으로 사용됩니다.

worker () {
    local -n tasks="$1"
    local -n hosts="$2"

    for host in "${hosts[@]}"; do
        for task in "${tasks[@]}"; do
            # run "$task" on "$host"
        done
    done
}

mytasks=( x y z )
myhosts=( a b c )

my_otherhosts=( k l m )

worker mytasks myhosts        # run my tasks on my hosts
worker mytasks my_otherhosts  # run my tasks on my other hosts

위 함수는 worker두 개의 문자열을 매개변수로 받습니다. 이 문자열은 배열의 이름입니다. localwith 를 사용하여 이름 참조 변수로 참조 명명된 변수를 선언 -n합니다 . 함수에 전달하는 이름 변수는 배열이므로 함수에서 이름 참조 변수를 배열로 사용할 수 있습니다.taskshosts

코드의 오류는 이름 참조 변수가 배열이 될 수 없다는 것입니다. 이것이 바로 변수 array1이고 이것이 바로 no문에서 출력을 얻는 이유 입니다 if. 코드를 실행할 때 셸에서도 이 오류가 언급됩니다.

$ bash script
Variable 'array1[10]' not exist
Variable 'array1[11]' is defined
Variable 'array1[12]' is defined
Variable 'array1[30]' not exist
Variable 'array1[50]' not exist
Variable 'array1[51]' not exist
Variable 'array1[128]' not exist
Variable 'array1[129]' not exist
Variable 'array1[130]' not exist
script: line 10: declare: array1: reference variable cannot be an array
        triage
        51=[trajectory]
        129=[dynamic law]
no

당신은 가질 수 있습니다다른그러나 변수 참조는 다음 array1과 같습니다.

declare -n array2=array1

관련 정보