입력을 읽을 때 사용되는 이유는 무엇입니까 read
? 입력의 ???
결과는 무엇입니까 bin src
?
$ read
???
$ echo $REPLY
bin src
macOS에서 실행됩니다 bash
.
답변1
변수에 저장된 데이터 REPLY
는 그대로인데 ???
, 변수를 사용한 결과는인용되지 않음with 는 echo
당신이 하고 있는 것처럼 하는 것과 같습니다
echo ???
모든 변수 확장에는 큰따옴표가 필요합니다.
변수를 따옴표 없이 확장하면 두 가지 일이 발생합니다.
- 변수의 값은나뉘다여러 단어로. 문자가 문자 중 하나
$IFS
(기본적으로 공백, 탭 및 줄 바꿈) 와 동일한 경우 분할이 발생합니다. 귀하의 경우???
값을 수정하지 않으면 분할 결과는 분할 전과 동일합니다(단어 한 단어).$IFS
- 생성된 각 단어는파일 이름 생성, 또는 "파일 이름 와일드카드". 즉, 단어가 와일드카드 패턴인 경우, 즉
???
패턴과 일치하는 모든 파일 이름이 패턴을 대체합니다. 이 패턴은???
3자 길이의 모든 파일 이름과 일치하며 현재 작업 디렉터리에는 분명히 두 개의 파일 이름이 있습니다.
변수 확장이 큰따옴표로 묶여 있으면 이러한 일이 발생하지 않습니다.
예를 들어 문제를 재현하고 해결해 보세요.
$ ls
X11R6 games lib libexec mdec ports share xobj
bin include libdata local obj sbin src
$ read
???
$ echo $REPLY
bin lib obj src
$ echo ???
bin lib obj src
$ echo "$REPLY"
???
위와 동일한 디렉터리의 또 다른 예에서는 입력 문자열이 두 단어( ???
및 s*
)로 분할되어 파일 이름 글로빙 패턴으로 사용되는 것을 보여줍니다.
$ read
??? s*
$ echo $REPLY
bin lib obj src sbin share src
$ echo "$REPLY"
??? s*
이는 및 와 src
모두 일치하므로 두 번 출력 됩니다 .???
s*
관련된:
위의 질문과 답변을 간략하게 요약하면 다음과 같습니다. 언제나큰따옴표모두단, 어떤 확장이 필요하지 않은지 정확히 모르거나 실제로 분할 및 와일드카드를 호출하려는 경우는 제외됩니다.