환경 변수에서 작은 따옴표와 큰 따옴표의 의미는 무엇입니까?


19

내 .profile에 다음과 같은 환경 변수를 정의했습니다.

MY_HOME="/home/my_user"

그러나 따옴표를 제거하고 파일을 다시 소스하지 않으면 변수가 평가되지 않는 것 같습니다. 공백이 있으면 따옴표가 필요하고 이스케이프를 원하지 않으면 작은 따옴표가 사용됩니다. 변수 정의에서 작은 따옴표와 큰 따옴표의 중요성을 명확히 할 수 있습니까? 프론트 틱과 백 틱은 어떻습니까?

답변:


23

나는 당신이 용어에 대해 혼란스러워 생각합니다.

"환경 변수"는 자식 프로세스가 상속 할 쉘 변수 일뿐입니다.

예제에서하고있는 것은 쉘 변수를 만드는 것입니다. 내보낼 때까지 환경에 없습니다.

MY_HOME="/home/my_user"
export MY_HOME

거의 모든 쉘 (csh, tcsh 제외)에 "MY_HOME"이라는 변수를 넣습니다.

이 특별한 경우에는 큰 따옴표가 불필요합니다. 효과가 없습니다. 부분 문자열을 큰 따옴표로 묶지 만 변수 대체를 수행하는 데 사용하는 모든 쉘을 허용합니다. 작은 따옴표 그룹 하위 문자열로 대체를 방지합니다. 예제 할당에는 변수가 없으므로 큰 따옴표는 작은 따옴표로 표시되었을 수 있습니다.

V='some substrings grouped together'  # assignment
X="Put $V to make a longer string"    # substitution and then assignment
Y=`date`                              # run command, assign its output
Z='Put $V to make a longer string'    # no substition, simple assignment

내보낼 때까지 환경에 아무것도 없습니다.


18

쉘 변수와 환경 변수

MY_HOME="/home/my_user"라는 쉘 변수를 설정합니다 MY_HOME. 쉘은 프로그래밍 언어이며 변수 (파라미터라고도 함)가 있습니다. 이 할당 후에 변수의 값을 사용할 수 있습니다 (예 : with) echo "$MY_HOME".

쉘 변수는 내부 쉘 개념입니다. 해당 쉘 인스턴스가 종료되면 MY_HOME잊혀집니다. 모든 프로그램이 알고 있고 자녀에게 전달하는 것은 환경 변수 입니다.

셸 내에서 환경 변수와 셸 변수는 매우 비슷한 방식으로 작동합니다. 실제로 일어나는 것은 쉘에서 부모로부터 상속받은 모든 환경 변수가 쉘 변수가된다는 것입니다. 반대로, 셸 스크립트에 정의 된 셸 변수는 내 보내면 환경 변수가됩니다 .

export MY_HOME="/home/my_user"

처음 읽을 때 건너 뛸 수있는 자세한 내용

쉘 변수가 자동으로 환경 변수가되지 않는 이유는 부분적으로 스크립트가 실수로 시작한 프로그램에 의미있는 변수 이름을 사용하고 일부는 역사적 일 수도 있기 때문입니다.

export변수 이름을 변경할 때마다 아주 오래된 쉘을 사용해야 했지만 모든 최신 쉘은 환경 변수에 대한 할당을 추적하여 다음 스 니펫이 에코합니다 bar.

myvar=foo
export myvar
myvar=bar
env | grep '^myvar='

또한, 일부 아주 오래된 쉘에 대해 별도의 명령이 필요 myvar=foo하고이 export myvar있지만, 모든 현대 쉘 이해 export myvar=foo.

set -a모든 쉘 변수 지정이 변수를 자동으로 내보내도록 실행할 수 있으므로 해당 쉘에서 먼저 실행 한 경우 myvar=foo와 동일합니다 .export myvar=fooset -a

인용에

인용은 대부분 직교입니다. 변수에 할당하는 값에 쉘에 특수한 문자가 포함되어 있지 않으면 따옴표가 필요하지 않습니다. 특수 문자가 있으면 작은 따옴표 나 큰 따옴표 또는 백 슬래시 또는 그 조합으로 보호해야합니다. 이것은 일반 myvar=value구문과 export유틸리티 모두에 적용됩니다.

할당 구문과 구문에는 하나의 차이점이 export있습니다. 쉘은 필드 (워드) 분할경로 이름 확장 (글 로빙)을$foo 수행하여 변수 대체 결과를 추가로 확장 합니다. 의 값이있는 경우 있음이 수단 이며 , 다음 인쇄합니다 단일 공백은 현재 디렉토리에있는 파일 목록 하였다. 이것은 거의 바람직하지 않으므로 경로 대체 또는 필드 분할이 필요하다는 것을 모르는 경우 변수 대체항상 큰 따옴표를 사용 하는 일반적인 원칙 입니다. 간단한 할당의 경우 실제로의 값 을myvarhello ​ *echo $myvarhelloecho "$myvar"othervar=$myvarmyvarothervar할당에서 글 로빙 및 단어 분리가 금지되기 때문에 여러 단어를 만들지 만 한 단어가 필요하기 때문입니다. export그러나이 분배는 적용되지 않습니다 . 따라서 간단한 규칙을 기억하려면 변수 대체에 항상 큰 따옴표를 사용하십시오.


"인용은 대부분 직교입니다." "인용"섹션에서? 나는 그 문장에서 직교 의 의미를 얻지 못한다 .
Monica에 대한 정의

1
@DKBose 한편으로는 환경 변수와 셸 변수, 그리고 따옴표는 서로 관련이 거의없는 두 가지 별도의 문제라는 것을 의미합니다. 위키 낱말 사전은 4와 5를 의미합니다.
Gilles 'SO-stop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.