생각하다:
a=b; b=c; c=d
그러면 다음과 같은 eval echo \$$a
출력이 생성됩니다.
c
d
input 만 사용하여 출력을 추출하려면 a
다음을 시도했습니다.
(i) eval echo \$(eval echo \$$a)
오류가 발생합니다:
syntax error near unexpected token '('
(ii) eval echo \$\(eval echo \$$a\)
산출물 생산:
c
절단 괄호를 이스케이프 처리하면 오류가 제거되는 이유를 이해할 수 없습니다.
d
또한 누군가 두 번째 인스턴스에서 출력을 얻지 못하는 이유를 설명할 수 있습니까 ?
답변1
먼저 다음 사항에 유의하세요.
보안 관점에서 볼 때 이를 사용하는 것은 매우 나쁜 eval
생각 입니다.어느당신이 모르는 경우 쉘 스크립트정확히뭐하세요. (그럼에도 실제로 이것이 최선의 솔루션인 경우는 거의 없습니다.) 쉘 스크립팅의 초보자로서 eval
Even이 존재한다는 사실을 잊어버리십시오.
자세한 내용은 다음을 참조하세요.평가 명령 및 보안 문제.
출력을 얻으려면 다음을 d
사용할 수 있습니다.
eval echo \$${!a}
또는:
eval eval echo \\\$\$$a
잘못된 부분은 이스케이프되지 않은 대괄호 문자를 에 전달하는 것입니다 echo
. 앞에 따옴표가 없는 문자가 있으면 $
명령 대체입니다. 하지만 $
인용된 경우아니요대괄호는 유효한 쉘 구문이 아닙니다.
답변2
중첩된 평가는 지저분한 것입니다.
첫 번째,
eval echo \$\(eval echo \$$a\)
인터프리터가 다음을 평가하도록 합니다.
echo $(eval echo $b)
가장 안쪽에 중첩된 명령(예: $(eval echo $b)
)을 삽입하면 다음과 같은 결과가 발생합니다.
echo c
결과는 다음과 같습니다.
c
중첩된 평가를 올바르게 평가하려면(강력히 권장합니다)아니요eval
사용된별말씀을요), 당신은 점점 이상해지고 있는 것 같습니다. 예를 보려면 다른 답변을 참조하세요.