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

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

.profile에 다음과 같이 일부 환경 변수를 정의했습니다.

MY_HOME="/home/my_user"

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

답변1

용어에 대해 헷갈리신 것 같아요.

"환경 변수"는 모든 하위 프로세스가 상속하는 단순한 쉘 변수입니다.

예제에서 수행한 작업은 셸 변수를 만드는 것입니다. 내보내기 전 환경에는 없습니다.

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

내보내기 전에 환경에는 아무것도 없습니다.

답변2

쉘 변수 및 환경 변수

MY_HOME="/home/my_user"설정쉘 변수MY_HOMEShell은 프로그래밍 언어이며 변수(매개변수라고도 함)를 가지고 있습니다 . 할당 후에는 변수의 값을 사용할 수 있습니다 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변수 대체 결과를 더욱 확장하고 다음을 실행합니다.필드(워드) 분할그리고경로명 확장(와일드카드). 즉 myvar, 값이 hello ​ *이면 echo $myvarprint , hello공백, 현재 디렉터리의 파일 목록이 차례로 표시됩니다. 이는 거의 바람직하지 않으므로 일반적인 원칙은 다음과 같습니다.변수 대체에는 항상 큰따옴표를 사용하십시오.(경로 이름 확장이나 필드 분할이 필요하다는 것을 알지 않는 한): echo "$myvar".단순 할당의 경우 to의 값은 othervar=$myvar실제로 안정적으로 복사됩니다 . 왜냐하면 와일드카드와 단어 분리기는 할당에서 금지되어 있기 때문입니다(여러 단어를 생성하지만 단일 단어를 예상하기 때문입니다). 단어) . 그러나 이 면제는 적용되지 않습니다 . 따라서 간단한 규칙을 기억하려면 항상 변수 대체에 큰따옴표를 사용하십시오.myvarothervarexport

관련 정보