변수 이름으로 다른 변수 호출(Bash)

변수 이름으로 다른 변수 호출(Bash)

이제 다음 길이 남았어

langs="EN GE"
dir_EN=/xx
dir_GE=/zz

보시다시피 $langs 변수에는 단일 배열에 가능한 모든 언어가 포함되어 있습니다. 언어가 무엇인지 확인한 다음 해당 경로를 저장하는 루프를 사용하여 이러한 모든 경로를 다중 언어(dir_ML) 배열에 저장하고 싶습니다. 이것이 내가 지금까지 가지고 있는 것입니다

for i in $(seq 0 1); do #I used seq because I didn't know how to specify the length of the variable $langs
    dir_ML[$i]=dir_${langs[$i]}
done

내가 찾고있는 결과는 다음과 같습니다.

dir_ML[0]=/xx

dir_ML[1]=/zz

내가하려는 일을 이해하시기 바랍니다! 미리 감사드립니다

답변1

langs배열이 아니라 코드의 문자열입니다.

배열로 만들어서 사용하세요:

langs=( EN GE )
dir_EN=/xx
dir_GE=/zz

dir_ml=()
for i in "${langs[@]}"; do
    declare -n p="dir_$i"
    dir_ml+=( "$p" )
done

printf 'dir_ml = "%s"\n' "${dir_ml[@]}"

위의 루프에서는 $isum 값이 순차적으로 얻어집니다 EN. GE이것은 또한이름 참조바꾸다 p. 값에 접근할 때 p변수가 선언될 때 할당된 문자열은 변수 이름으로 해석되고저것변수의 값을 반환합니다.

위의 출력은 다음과 같습니다.

dir_ml = "/xx"
dir_ml = "/zz"

에서 이름 참조를 사용하려면 버전 4.3 이상이 bash필요합니다 .bash


또 다른 (흥미롭지만 열등한) 가능성:

dir_EN=/xx
dir_GE=/zz

# (can't set dir_ml=() here as its name would be picked up by the loop)
unset dir_ml

for i in "${!dir_@}"; do
    dir_ml+=( "${!i}" )
done

printf 'dir_ml = "%s"\n' "${dir_ml[@]}"

여기서는 $i다음 값을 사용합니다.변수 이름 dir_EN그리고 dir_GE차례로. 그런 다음 우리는가변 간접${!i}변수의 값을 얻으 려면 이 변형에는 배열이 필요하지 않지만 langs다음과 같이 가정합니다.다른 변수는 명명되지 않았습니다 dir_.(사용자가 그러한 이름을 가진 변수를 스크립팅 환경에 쉽게 주입할 수 있기 때문에 이것은 약간 취약한 것으로 간주될 수 있습니다.)

이 코드의 출력은 위의 코드와 동일합니다.

답변2

이는 다음을 통해 수행할 수 있습니다.

#!/bin/bash
langs=(EN GE)
dir_EN=/xx
dir_GE=/zz

for i in ${!langs[@]}; do
        temp="dir_${langs[i]}"
        dir_ML[i]=${!temp}
done

먼저 이것이 배열이어야 하기 때문에 langs="EN GE"으로 변경했습니다 .langs=(EN GE)

$(seq 0 1)또한 배열의 각 항목으로 확장 되는 ${!langs[@]}인덱스(또는 연관 배열의 경우 이름)를 변경했습니다 . 따라서 이 예에서는 0 1.

그런 다음 임시 변수를 dir_${langs[i]}( dir_ENdir_GE)로 설정했습니다.

그런 다음 !매개변수 확장을 사용하여 해당 이름의 변수를 확장하여 요소를 설정합니다.dir_ML

관련 정보