변수 값과 문자열을 결합하여 다른 변수를 형성합니다.

변수 값과 문자열을 결합하여 다른 변수를 형성합니다.

다음을 사용하지 않고 변수에서 bash 변수를 참조하고 싶습니다.

echo "${!VARNAME}"

어떤 아이디어가 있나요? 변수를 동적으로 사용하고 싶은데 그런 참조가 많기 때문에 다른 변수로 선언해서 사용할 수는 없습니다.

예:

var1=host
${var1}_file ----> host_file is another variable that i want to call in a command. 

답변1

sh스크립트를 작성하지 않는 한 (귀하가 아닌 bash) 변수 간접 참조를 사용하고 싶지 않은 이유를 정말로 이해하지 못합니다 .

이미 언급한 대로 eval작동하지만 일반적으로 사용이 위험할 수 있기 때문에 눈살을 찌푸리게 됩니다. 특히 주의 깊게 정리하지 않고 사용자가 제공한 데이터를 평가할 때 더욱 그렇습니다.

동일한 효과를 얻는 또 다른 방법은 이름 참조 변수( bash버전 4.3부터 사용 가능)를 사용하는 것입니다.

var1=host

declare -n nameref="${var1}_file"

nameref="something something"

printf '%s\n' "$host_file"

그러면 문자열이 출력됩니다 something something. 및 에서 작동 하도록 하려면 typeset -n대체를 사용하십시오 .declare -nbashksh93

답변2

변수 이름이 고유 이름과 관련 속성의 조합으로 명명된 경우 연관 배열을 사용해야 합니다. Bash 4.x, ksh 또는 zsh가 있다고 가정합니다. 보다페이지또는다른BashGuide에서. (실제로 C에서 이와 같은 구조를 만드는 것은 좋지만 Bash에서는 실제로 이를 달성할 수 없습니다.)

즉, 호스트/클러스터의 URL과 포트를 저장하려면 , oregon, , 4 개의 변수 arizona를 만들지 말고 대신 다음과 같이 하십시오.arizona_urlarizona_portoregon_urloregon_port

typeset -A urls ports
urls[oregon]="http://..."
urls[arizona]="http://..."
ports[oregon]=1234
ports[arizona]=2345

"${urls[$hostname1]}"그런 다음 등과 함께 사용하십시오 ."${ports[$hostname]}"

답변3

이전 답변에 따르면 eval을 사용하여 이를 달성할 수 있습니다.

eval [arg ...] 인수를 읽고 이를 단일 명령으로 연결합니다. 그런 다음 쉘은 명령을 읽고 실행하며 해당 종료 상태는 eval 값으로 반환됩니다. 인수가 없거나 null 매개변수만 있는 경우 eval은 0을 반환합니다. (bash 매뉴얼 페이지에서)

그러나 이는 잘 알고 있어야 하고 가능한 한 적게 사용해야 하는 나쁜 프로그래밍 방식입니다. 일반적으로 더 우아하고 오류가 덜 발생하며 디버깅하기 쉬운 것을 선호하여 이를 피할 수 있습니다.

var1=host
eval echo ${var1}_file # print contents of $host_file

답변4

배열에서도 작동합니다!

다음은 @Kusalananda의 접근 방식에 대한 일반화이지만 배열을 사용하는 것입니다.

declare -a array_a=()
declare -n array_b="array_a"
for ((i=0;i<=9;i++)); do
    array_b+=($i)
done
length=${#array_a[*]}
for ((i=0;i<=$(($length-1));i++)); do
    echo "${array_a[$i]}"
done

감사해요!

관련 정보