두 가지 간접 계층을 구축하려고 하는데 이 문제의 피해자인지 알려주세요.XY 문제
내가 달성하고 싶은 것에 대한 간략한 설명
> test1=\$test2
> test2="string to print"
> echo $test2
string to print
> echo $test1
$test2
이 모든 것이 이해가 되지만 나는생각하다실행 명령을 이용하여 $test1
출력하는 것입니다 string to print
. 내 직감 반응은 이것이 효과가 있다는 것입니다
> echo $(echo $test1)
$test2
무의미한 말. 이것이 가능한지 다른 사람이 알고 있습니까?
내가 이것을 달성하려는 이유를 더 자세히 설명하십시오.
$variables
많은 텍스트 파일을 생성하는 데 재사용할 수 있는 템플릿이 포함된 텍스트 파일 템플릿을 만들고 싶습니다 . 내 생각은 환경 변수를 설정하고 템플릿 파일을 처리하고 다른 파일로 출력하는 것입니다.
예:
> #set vars
> cat template.txt | magic_var_expansion_cmd > out1.txt
> #set vars
> cat template.txt | magic_var_expansion_cmd > out2.txt
> #set vars
> cat template.txt | magic_var_expansion_cmd > out3.txt
이는 분명히 스크립트에서 더 정교한 방식으로 사용될 수 있지만 여기서는 다음과 같습니다.MVP내 마음 속에.
답변1
$ test1="hello"
$ test2="test1"
$ echo "${!test2}"
hello
bash
매뉴얼 에서 :
매개변수의 첫 번째 문자가 느낌표(
!
)이고 매개변수가 이름 참조가 아닌 경우 변수 간접 참조 수준이 도입됩니다. Bash는 나머지 인수로 구성된 변수 값을 변수 이름으로 사용합니다. 그런 다음 해당 변수를 확장하고 인수 자체의 값이 아닌 나머지 대체에 해당 값을 사용합니다. 이를 간접 확장이라고 합니다. 인수가 nameref인 경우 전체 간접 확장을 수행하는 대신 인수가 참조하는 변수의 이름으로 확장됩니다. 아래에 설명된 확장은 예외입니다${!prefix*}
.${!name[@]}
느낌표는 간접적인 관계를 소개하기 위해 여는 중괄호 바로 뒤에 와야 합니다.
질문의 두 번째 부분에서는 템플릿에서 실제 쉘 변수를 사용하지 않고 대신 쉽게 구문 분석 가능한 자리 표시자를 사용하고 sed
.
"를 포함하여 몇 가지 유사한 질문이 있습니다.문서의 자리 표시자 문자열을 파일의 콘텐츠로 바꾸는 방법","템플릿에서 텍스트 파일을 생성하는 도구" 그리고"텍스트 파일에서 자리 표시자 목록을 바꾸는 방법은 무엇입니까?"(아직 더 있어요).
답변2
사용평가하다
$ test1=\$test2
$ test2="string to print"
$ echo $test2
string to print
$ eval echo $test1
string to print