Bash 변수 확장이 따옴표를 유지하는 이유는 무엇입니까?

Bash 변수 확장이 따옴표를 유지하는 이유는 무엇입니까?
> echo "hi"
hi
> VAR='echo "hi"'
> $VAR
"hi"

위 명령의 출력이 다른 이유는 무엇입니까?

작은따옴표에서도 비슷한 일이 발생합니다.

> VAR="echo 'hi'"
> $VAR
> 'hi'

답변1

추가 견적 쌍은 추가 평가 단계에서만 사용됩니다. 예를 들어 힘 eval:

bash-4.2$ VAR='echo "hi"'

bash-4.2$ $VAR
"hi"

bash-4.2$ eval $VAR
hi

그러나 일반적으로 문자열에 매개변수가 포함된 명령을 넣는 것은 좋은 생각이 아닙니다. 대신 배열을 사용하십시오.

bash-4.2$ VAR=(echo "hi")

bash-4.2$ "${VAR[@]}"
hi

답변2

견적 삭제원래 입력 단어에만 나타납니다.아니요확장된 결과에 관해서. 확장된 변수의 일부인 따옴표는 변경되지 않습니다.

답변3

한발 물러서면 왜 변수 대체가 따옴표를 유지해야 하는지 이해하게 될 것입니다.

Unix/Linux/BSD 셸에서 따옴표의 목적은 여러 문자열로 구문 분석될 문자열 부분을 함께 유지하는 것입니다. 셸은 기본적으로 공백을 토큰 구분 기호로 사용하므로 공백이 있는 문자열(예: "one two three")은 어떤 방식으로든 인용되거나 이스케이프되지 않으면 3개의 문자열로 구문 분석됩니다. "one two three" ", "two" 그리고 "셋".

프로그래머가 특정 변수의 값이 삽입된 문자열을 원하는 경우:

VAR=two
STRING="one $VAR three"

쉘은 따옴표를 제거해서는 안 됩니다. 공백이 포함된 문자열은 3개의 작은 문자열로 구문 분석됩니다.

관련 정보