programing

변수 이름이 문자열로 저장되는 경우 변수 값을 얻는 방법은 무엇입니까?

telebox 2023. 4. 12. 22:12
반응형

변수 이름이 문자열로 저장되는 경우 변수 값을 얻는 방법은 무엇입니까?

변수 이름이 문자열인 경우 bash 변수 값을 가져오려면 어떻게 해야 합니까?

var1="this is the real value"
a="var1"
Do something to get value of var1 just using variable a.

콘텍스트:

AMI(Amazon Machine Image)가 몇 개 있는데, 각 AMI의 인스턴스를 몇 개 기동하고 싶습니다.부팅이 완료되는 대로 AMI 유형에 따라 각 인스턴스를 설정합니다.어느 AMI에서도 스크립트나 비밀키를 많이 굽고 싶지 않기 때문에 일반화된 스타트업 스크립트를 준비하여 공개 링크를 사용하여 S3에 올렸습니다.rc.local에 스타트업 스크립트를 가져와 실행하는 작은 코드를 입력합니다.AMI에 있는 건 이게 다야그런 다음 각 AMI는 모든 AMI 및 각 AMI에 적용되는 공통 구성 스크립트에 액세스합니다.이러한 스크립트는 비공개이며 액세스하려면 서명된 URL이 필요합니다.

여기서 AMI 인스턴스(my_private_ami_1)를 기동하면 키/값 쌍에 관한 모든 개인 스크립트의 서명된 URL을 포함하는 S3에 표시된 파일1개를 더 전달합니다.

config_url="http://s3.amazo.../config?signature"
my_private_ami_1="http://s3.amazo.../ami_1?signature"
...
When the startup script runs, it downloads the above file and source's it. Then it checks for its AMI type and picks the correct setup script for itself.

ami\_type=GET AMI TYPE #ex: sets ami\_type to my\_private\_ami\_1
setup\_url=GET THE SETUP FILE URL BASED ON AMI\_TYPE # this is where this problem arises

AMI 타입에 관계없이 인스턴스를 기동할 수 있는 범용 코드를 사용할 수 있게 되어 인스턴스는 스스로 처리할 수 있게 되었습니다.

하시면 됩니다.${!a}:

var1="this is the real value"
a="var1"
echo "${!a}" # outputs 'this is the real value'

다음으로 간접 파라미터 확장 예를 나타냅니다.

은 of개음음 음음음음 음음음 음음음 음음 the the 。${parameter}의 の of 。parameter환됩니니다다

「 」의 첫 일 parameter는 느낌표(!)로 변수 간접 수준을 도입합니다. Bash에서 합니다.parameter이되어 그 됩니다.이 값은 「치환」의, 「치환」의 값이 .parameter그 자체입니다.

X=foo
Y=X
eval "Z=\$$Y"

Z로로 합니다.foo.

동료 zsh 사용자의 경우 승인된 답변과 동일한 작업을 수행하는 방법은 다음과 같습니다.

echo ${(P)a} # outputs 'this is the real value'

파라미터 이름 치환이라고 하는 것이 적절합니다.

그러면 파라미터 이름 값이 추가 파라미터 이름으로 해석됩니다.이 파라미터 이름의 값은 필요에 따라 사용됩니다.typeset 명령어패밀리의 1개로 설정된 플래그(특히 변환)는 이 방법으로 사용되는 이름 값에는 적용되지 않습니다.

중첩된 매개 변수 또는 명령 대체와 함께 사용되는 경우, 그 결과는 동일한 방식으로 매개 변수 이름으로 간주됩니다.예를 들어 'foo=bar' 및 'bar=baz'가 있는 경우 문자열 ${(P)foo}, ${(P)${foo}} 및 ${(P)$(echo bar)}이(가) 'baz'로 확장됩니다.

마찬가지로 참조 자체가 중첩된 경우 플래그가 포함된 식은 파라미터 이름으로 직접 대체된 것으로 간주됩니다.이 중첩된 치환으로 여러 개의 단어가 포함된 배열이 생성되면 오류가 발생합니다.예를 들어 매개 변수 assoc가 연관 배열인 'name=assoc'인 경우 '${(P)name}[elt]}'은 연관 첨자 'elt'의 요소를 참조합니다.

검색 키워드를 수정하여 :)를 취득했습니다.

eval a=\$$a
Thanks for your time.

bash 4.3+에서는,declare -n:

#!/usr/bin/env bash

var="this is the real value"
var_name="var"

declare -n var_ref=$var_name
echo "${var_ref}"

어레이에서도 같은 문제가 발생했지만 어레이를 조작하고 있는 경우는, 다음의 순서에 따릅니다.

array_name="ARRAY_NAME"
ARRAY_NAME=("Val0" "Val1" "Val2")

ARRAY=$array_name[@]
echo "ARRAY=${ARRAY}"
ARRAY=("${!ARRAY}")
echo "ARRAY=${ARRAY[@]}"
echo "ARRAY[0]=${ARRAY[0]}"
echo "ARRAY[1]=${ARRAY[1]}"
echo "ARRAY[2]=${ARRAY[2]}"

다음과 같이 출력됩니다.

ARRAY=ARRAY_NAME[@]
ARRAY=Val0 Val1 Val2
ARRAY[0]=Val0
ARRAY[1]=Val1
ARRAY[2]=Val2

bash 4.3에서는 set 변수에 대한 '-v' 테스트가 도입되었습니다.동시에 'nameref' 선언이 추가되었습니다.다음의 2개의 기능과 indirection 연산자(!)를 조합하면, 앞의 예의 간이 버전이 유효하게 됩니다.

get_value()
{
  declare -n var_name=$1
  if [[ -v var_name ]]
  then
    echo "${var_name}"
  else
    echo "variable with name <${!var_name}> is not set"
  fi
}

test=123
get_value test
123

test="\$(echo \"something nasty\")"
get_value test
$(echo "something nasty")

unset test
get_value test
variable with name <test> is not set

이 접근법은 '평가'의 필요성을 없애기 때문에 더 안전하다.이 코드는 bash 5.0.3 (1)에서 확인되었습니다.

최신 쉘은 이미 어레이(어소시에이션 어레이도 지원)를 지원하고 있습니다.그러니까 꼭 사용해주시고 평가도 적게 해주세요.

var1="this is the real value"
array=("$var1")
# or array[0]="$var1"

그런 다음 호출할 때 ${array[0]}을(를) 에코합니다.

답변에 근거합니다.https://unix.stackexchange.com/a/111627

###############################################################################
# Summary: Returns the value of a variable given it's name as a string.
# Required Positional Argument: 
#   variable_name - The name of the variable to return the value of
# Returns: The value if variable exists; otherwise, empty string ("").
###############################################################################
get_value_of()
{
    variable_name=$1
    variable_value=""
    if set | grep -q "^$variable_name="; then
        eval variable_value="\$$variable_name"
    fi
    echo "$variable_value"
}

test=123
get_value_of test
# 123
test="\$(echo \"something nasty\")"
get_value_of test
# $(echo "something nasty")
VALUE=$(eval "echo \$$SOME_VAR_NAME")

SSH_KEY_FILE_PATH_FOO="/tmp/key"
SSH_KEY_FILE_PATH_VAR_NAME_PREFIX="SSH_KEY_FILE_PATH"
SSH_KEY_FILE_PATH_VAR_NAME_SUFFIX="FOO"
SSH_KEY_FILE_PATH=$(eval "echo \$${SSH_KEY_FILE_PATH_VAR_NAME_PREFIX}_${SSH_KEY_FILE_PATH_VAR_NAME_SUFFIX}")
echo "$SSH_KEY_FILE_PATH"
/tmp/key

언급URL : https://stackoverflow.com/questions/1921279/how-to-get-a-variable-value-if-variable-name-is-stored-as-string

반응형