eval 명령을 두 번 사용하십시오.

eval 명령을 두 번 사용하십시오.

생각하다:

a=b; b=c; c=d

그러면 다음과 같은 eval echo \$$a출력이 생성됩니다.

c

dinput 만 사용하여 출력을 추출하려면 a다음을 시도했습니다.

(i) eval echo \$(eval echo \$$a)오류가 발생합니다:

syntax error near unexpected token '('

(ii) eval echo \$\(eval echo \$$a\)산출물 생산:

c

절단 괄호를 이스케이프 처리하면 오류가 제거되는 이유를 이해할 수 없습니다.

d또한 누군가 두 번째 인스턴스에서 출력을 얻지 못하는 이유를 설명할 수 있습니까 ?

답변1

먼저 다음 사항에 유의하세요.

보안 관점에서 볼 때 이를 사용하는 것은 매우 나쁜 eval생각 입니다.어느당신이 모르는 경우 쉘 스크립트정확히뭐하세요. (그럼에도 실제로 이것이 최선의 솔루션인 경우는 거의 없습니다.) 쉘 스크립팅의 초보자로서 evalEven이 존재한다는 사실을 잊어버리십시오.

자세한 내용은 다음을 참조하세요.평가 명령 및 보안 문제.


출력을 얻으려면 다음을 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사용된별말씀을요), 당신은 점점 이상해지고 있는 것 같습니다. 예를 보려면 다른 답변을 참조하세요.

답변3

d다음을 사용하여 예상되는 출력을 얻을 수 있습니다.

eval echo \$$(echo ${!a})

${!a}c값을 제공하는 bash 변수 이름 확장입니다 . 보다배쉬 매뉴얼.

관련 정보