전달된 이름을 사용하여 배열에 쓰는 함수를 작성하려고 합니다. 다음 bash 기능이 제공됩니다.
function writeToArray {
local name="$1"
echo "$name"
declare -a "$name"
${name[0]}="does this work?"
}
다음과 같이 실행하세요:
writeToArray $("test")
두 가지 오류가 발생합니다.
bash: declare: `': not a valid identifier
=does this work?: command not found
나는 이것을 할 수 있을 것으로 기대합니다:
writeToArray $("test")
for item in "${test[@]}"; do
echo "item"
echo "$item"
done
다음과 같이 인쇄되어야 합니다.
item
does this work?
배열( 함수 외부에서 test
명명된 배열을 읽을 수 있도록 예제에서 명명됨 )에 쓰도록 올바르게 구성하려면 어떻게 해야 합니까?test
답변1
nameref를 사용하여 이 작업을 수행할 수 있습니다.
writeToArray() {
local -n writeToArray_name="$1"
writeToArray_name[0]="does this work?"
}
시험:
bash-5.0$ test[123]=qwe
bash-5.0$ writeToArray test
bash-5.0$ typeset -p test
declare -a test=([0]="does this work?" [123]="qwe")
bash
아직 nameref가 없는 이전 버전의 경우 다음을 사용할 수 있습니다 eval
.
writeToArray() {
eval "$1[0]='does this work?'"
}
인수 writeToArray
와 함께 호출하고 인수 로 전달한 다음 셸 언어에서 코드로 호출하면 배열 인덱스 0의 요소에 할당됩니다 (연관 배열에서도 작동하며 스칼라 변수는 배열로 변환됩니다).test
eval
test[0]='does this work?'
eval
does this work?
test
이는 목록 컨텍스트에서 $("test")
명령 출력 및 분할+글로브를 캡처하고 확장하기 위한 구문입니다 . ( 일명 인수가 전달되지 않으면 출력을 생성하지 않음) 빈 문자열로 확장되고 Split+glob은 결과를 제공하지 않습니다.test
test
[
$("test")
여기 이건이름writeToArray
따라서 에 전달하려는 변수는 test
해당 내용( "$test"
)도 아니고 같은 이름의 명령 출력( )도 아니며, "$(test)"
Split+glob의 영향을 많이 받는 같은 이름의 명령 출력 도 아닙니다. 당신의 시도로.$("test")