Bash는 함수 내부에 array라는 매개변수를 생성합니다.

Bash는 함수 내부에 array라는 매개변수를 생성합니다.

전달된 이름을 사용하여 배열에 쓰는 함수를 작성하려고 합니다. 다음 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의 요소에 할당됩니다 (연관 배열에서도 작동하며 스칼라 변수는 배열로 변환됩니다).testevaltest[0]='does this work?'evaldoes this work?test

이는 목록 컨텍스트에서 $("test")명령 출력 및 분할+글로브를 캡처하고 확장하기 위한 구문입니다 . ( 일명 인수가 전달되지 않으면 출력을 생성하지 않음) 빈 문자열로 확장되고 Split+glob은 결과를 제공하지 않습니다.testtest[$("test")

여기 이건이름writeToArray따라서 에 전달하려는 변수는 test해당 내용( "$test")도 아니고 같은 이름의 명령 출력( )도 아니며, "$(test)"Split+glob의 영향을 많이 받는 같은 이름의 명령 출력 도 아닙니다. 당신의 시도로.$("test")

관련 정보