Linux 셸 스크립트: 사용자가 입력 프롬프트에 변수 이름을 제공하도록 허용

Linux 셸 스크립트: 사용자가 입력 프롬프트에 변수 이름을 제공하도록 허용

저는 Linux 터미널용 쉘 스크립트를 작성 중입니다. 프롬프트에 변수 이름을 입력할 수 있기를 원합니다. 예를 들어:

테스트.sh:

 test="Monkey in the middle..."
 read -p "Enter input: " input
 echo $input

산출:

 Enter input: $test
 $test

read -p스크립트의 프롬프트 세그먼트 중에 "$test"를 입력하고 스크립트가 지금처럼 "$test"를 에코하는 대신 끝에 "Monkey in the middle..."을 에코 하도록 할 수 있기를 원합니다 .

어떻게 하면 될까요?



업데이트:

여기와 여기에서 나에게 제공된 답변을 사용하여이 스레드(기여자와 해설자에게 큰 감사를 드립니다!) 저는 저에게 아주 잘 맞는 다음 줄을 구성할 수 있었습니다.

newvariable="$(eval echo $input)" 

참고로 저는 eval을 사용하면 보안 위험이 발생할 수 있다는 경고를 여러 번 받았습니다. 이 솔루션을 선택하는 경우 이 점을 명심하십시오.

답변1

대신에

echo "$input"

노력하다

eval echo "$input"

bash에만 국한되지 않고 /bin/sh에서 작동합니다!

이는 eval사용자가 지정한 대로만 실행되기 때문에 심각한 보안 위험을 초래합니다. 이 경우 쉘은 문자열을 $input로 해석한 $test다음 eval를 실행합니다 echo $test. 하지만 사용자가 입력하면 어떻게 될까요 $test; rm -rf *? eval로 제시될 것입니다 echo $test; rm -rf *. 이 작업을 수행하는 경우 매우 조심하십시오.

답변2

Bash에서는 다음을 사용할 수 있습니다.간접 매개변수 확장통사론:

test="Monkey in the middle..."
read -p "Enter input: " input
echo ${!input}

이 경우 사용자는 test앞에 달러 기호 없이 문자열만 제공해야 합니다.

답변3

사용자가 명령 대체를 포함하여 임의의 명령을 실행할 수 있다는 점에 신경쓰지 않는 한 $(…)문자열을 eval내장에 제출할 수 있습니다. 셸 조각이 필요 eval하며 입력에 따옴표가 포함되어 있으면 구문 오류가 발생할 수 있습니다. 따옴표에 대처하는 (상대적으로) 쉬운 방법은 여기 문서를 사용하여 대체를 수행하는 것입니다. 종료되지 않은 변수나 명령 대체(예 $(foo: )가 여전히 남아 있습니다.

IFS= read -r -p "Enter input: " input
eval "string=\$(cat <<EOF
_${input}
EOF
)"
string=${string#_}

관련 정보