다음을 사용하지 않고 변수에서 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 -n
bash
ksh93
답변2
변수 이름이 고유 이름과 관련 속성의 조합으로 명명된 경우 연관 배열을 사용해야 합니다. Bash 4.x, ksh 또는 zsh가 있다고 가정합니다. 보다페이지또는다른BashGuide에서. (실제로 C에서 이와 같은 구조를 만드는 것은 좋지만 Bash에서는 실제로 이를 달성할 수 없습니다.)
즉, 호스트/클러스터의 URL과 포트를 저장하려면 , oregon
, , 4 개의 변수 arizona
를 만들지 말고 대신 다음과 같이 하십시오.arizona_url
arizona_port
oregon_url
oregon_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
감사해요!