(z)sh 스크립트에서 별표/글로브를 올바르게 이스케이프 처리합니다.

(z)sh 스크립트에서 별표/글로브를 올바르게 이스케이프 처리합니다.

다음과 같은 문제가 있습니다. 와일드카드 문자를 일반 텍스트로 포함하는 환경 변수가 필요하지만 이를 이스케이프할 수 없는 것 같습니다. 백슬래시 이스케이프를 사용하면 작동하지만 어떤 이유로 백슬래시는 여전히 문자열의 일부입니다. "

GLOB_SUBST를 비활성화하면 문제가 해결되지만 이를 방지하고 싶습니다.

문제의 범위를 좁히기 위해 다음 방법을 사용했습니다.

touch foo; chmod +x ./foo

# glob expansion i.E. $test contains all files in the directory.
echo 'export test="*"; echo $test' > foo; source ./foo 

# no glob expansion, but the escape character is added to the string.
echo 'export test="\*"; echo $test' > foo; source ./foo  
# output: \*

어떤 도움이라도 대단히 감사하겠습니다.

답변1

첫 번째 경우에는 문자열을 *변수에 할당하고 globsubst해당 옵션이 활성화되어 있으므로 따옴표가 없는 확장은 $testPOSIX 셸에서와 같이 와일드카드의 영향을 받습니다. 두 번째 경우에는 string 을 할당 \*하지만 백슬래시가 별표를 이스케이프하므로 glob으로 확장되지 않습니다. (그렇지 않으면 zsh는 비활성화하지 않는 한 일치하는 파일이 없다고 불평합니다. 백슬래시로 시작하는 파일 이름이 없을 수도 있지만 일치하는 glob은 \\*.)

글로빙을 중지하려면 변수 확장을 인용하십시오(예: echo "$test".

바라보다:언제 큰따옴표가 필요합니까?

export또한 동일한 셸 내에서만(또는 기본 셸과 소스 스크립트 사이에서도) 변수를 사용하려는 경우에는 필요하지 않습니다.

관련 정보