쉘 명령 'var="[ap]"; echo $var'는 "h"를 출력합니다. 설명이 있습니까? [복사]

쉘 명령 'var="[ap]"; echo $var'는 "h"를 출력합니다. 설명이 있습니까? [복사]

배쉬 버전:

$ bash -version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.  
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

주문하다:

$ var="[a-p]"; echo $var
h

이 설명의 이유가 무엇인지 아는 사람이 있습니다.

문맥상 쉘을 사용하여 구성 파일을 구문 분석하고 부분 이름을 얻기 위한 패턴을 찾고 있습니다.

[section-foo]
foo=bar

파일을 읽을 때 섹션 라인이 예를 들어 [ap]이면 이상하게 동작합니다.

답변1

h실행 중인 디렉터리에 파일 이름이 있습니다.

echo $var

쉘은 [a-p]glob을 사용하려고 시도하고, 일치하는 것이 있으면 glob을 일치하는 것으로 교체합니다. 파일명이 다음과 같은 h경우

echo h

확장을 참조하여 이를 방지할 수 있으며, 이로 인해 전역으로 간주되지 않습니다.

echo "$var"

답변2

따옴표를 사용하지 않으면 echo $var확장이 "분할" 및 "경로 이름 확장"("와일드카드 지정" 또는 "파일 이름 생성"이라고도 함)에 노출됩니다.

[이는 *( also 및 )을 포함하는 문자열이 ?"경로 이름 확장" 규칙에 따라 확장됨을 의미합니다. 귀하의 경우 이는 이름이 단 한 문자인 파일이 있음을 의미합니다 h.

확장자가 인용되면 "경로 이름 확장"이 수행되지 않습니다.

$ echo "$var"
[a-p]

관련 정보