먼저 내가 따라가이 답변그런 다음 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
두 개의 문자열을 매개변수로 받습니다. 이 문자열은 배열의 이름입니다. local
with 를 사용하여 이름 참조 변수로 참조 명명된 변수를 선언 -n
합니다 . 함수에 전달하는 이름 변수는 배열이므로 함수에서 이름 참조 변수를 배열로 사용할 수 있습니다.tasks
hosts
코드의 오류는 이름 참조 변수가 배열이 될 수 없다는 것입니다. 이것이 바로 변수 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