![쉘 명령 'var="[ap]"; echo $var'는 "h"를 출력합니다. 설명이 있습니까? [복사]](https://linux55.com/image/107847/%EC%89%98%20%EB%AA%85%EB%A0%B9%20'var%3D%22%5Bap%5D%22%3B%20echo%20%24var'%EB%8A%94%20%22h%22%EB%A5%BC%20%EC%B6%9C%EB%A0%A5%ED%95%A9%EB%8B%88%EB%8B%A4.%20%EC%84%A4%EB%AA%85%EC%9D%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
배쉬 버전:
$ 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]