변수 이름이 문자열로 저장된 경우 변수 값을 얻는 방법은 무엇입니까?
변수 이름이 문자열 인 경우 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 및 각각에 대한 특수 설정 스크립트에 적용 가능한 공통 구성 스크립트에 액세스합니다. 이 스크립트는 비공개이며 액세스하려면 서명 된 URL이 필요합니다.
이제 AMI 인스턴스 (my_private_ami_1)를 시작하면 S3에 표시되는 하나 이상의 파일에 대해 서명 된 URL을 전달합니다.이 파일에는 모든 개인 스크립트에 대한 서명 된 URL이 키 / 값 쌍으로 포함되어 있습니다.
config_url="http://s3.amazo.../config?signature"
my_private_ami_1="http://s3.amazo.../ami_1?signature"
...
시작 스크립트가 실행되면 위의 파일을 다운로드하여 파일을 다운로드
source
합니다. 그런 다음 AMI 유형을 확인하고 올바른 설정 스크립트를 선택합니다.
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'
다음은 간접 매개 변수 확장 의 예입니다 .
매개 변수 확장의 기본 형식은입니다
${parameter}
. 값parameter
이 대체됩니다.의 첫 번째 문자
parameter
가 느낌표 (!)이면 가변 간접 수준이 도입됩니다. Bash는 나머지parameter
이름으로 작성된 변수 값을 변수 이름으로 사용합니다. 그런 다음이 변수가 확장되고 해당 값이parameter
자체 값 대신 나머지 대체에 사용 됩니다.
X=foo
Y=X
eval "Z=\$$Y"
Z를 "foo"로 설정
의eval
값을 통해 실수로 코드를 추출 할 수 있으므로 주의해서 사용 하십시오${Y}
. 코드 삽입으로 인해 피해를 입을 수 있습니다.
예를 들어
Y="\`touch /tmp/eval-is-evil\`"
만들 것 /tmp/eval-is-evil
입니다. 물론 이것은 일부일 수도 있습니다 rm -rf /
.
검색 키워드를 수정하고 알았습니다 :).
eval a=\$$a
시간 내 줘서 고마워.
동료 zsh 사용자의 경우 허용되는 답변과 동일한 것을 수행하는 방법은 다음을 사용하는 것입니다.
${(P)a}
이를 매개 변수 이름 교체 라고합니다.
그러면 매개 변수 이름 값이 추가 매개 변수 이름으로 해석되어 해당 위치에서 적절한 값이 사용됩니다. typeset 명령 계열 중 하나 (특히 경우 변환)로 설정된 플래그는이 방식으로 사용 된 name 값에 적용되지 않습니다.
중첩 된 매개 변수 또는 명령 대체와 함께 사용되는 경우 결과는 동일한 방식으로 매개 변수 이름으로 사용됩니다. 예를 들어, 'foo = bar'및 'bar = baz'인 경우 문자열 $ {(P) foo}, $ {(P) $ {foo}} 및 $ {(P) $ (echo bar) }는 'baz'로 확장됩니다.
마찬가지로 참조 자체가 중첩 된 경우 플래그가있는 표현식은 마치 매개 변수 이름으로 직접 대체 된 것처럼 처리됩니다. 이 중첩 된 대체가 둘 이상의 단어로 배열을 생성하면 오류입니다. 예를 들어, 매개 변수 assoc이 연관 배열 인 'name = assoc'인 경우 '$ {$ {(P) name} [elt]}'은 연관 첨자 'elt'의 요소를 나타냅니다.
현대 쉘은 이미 배열 (및 연관 배열)을 지원합니다. 따라서 사용하고 평가를 줄이십시오.
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")
'Programming' 카테고리의 다른 글
C 프로그램에서 텍스트 파일을 문자로 "#include"[] (0) | 2020.07.12 |
---|---|
마지막 100 줄 로그 검색 (0) | 2020.07.12 |
크롬은 "이 페이지가 추가 대화 상자를 만드는 것을 방지"의 작업을 취소합니다. (0) | 2020.07.12 |
jQuery를 사용하여 포인터를 손가락으로 바꾸는 방법은 무엇입니까? (0) | 2020.07.12 |
data.frame의 각 행을 복제하고 각 행의 복제 수를 지정하십시오. (0) | 2020.07.12 |