나는 bash 튜토리얼에서 이 예를 발견했습니다:
words="foo bar doo"; for x in $words; do ...
내 이해는 이 경우 words
"문자열과 공백"을 사용하여 정의된 일반 변수라는 것입니다. 저자는 이에 대해 설명하지 않습니다(이것은 bash 초보자 튜토리얼입니다).
내 질문은 이 작업을 수행하는 bash(또는 다른 쉘)의 기능이 무엇인지입니다.
for x in $words
x
- 각 반복마다 값을 할당한다는 의미입니다 . foo
bash 매뉴얼에 문서화된 이 기능을 어디에서 찾을 수 있습니까? 일부 링크(문서, 블로그)를 알려 주시면 감사하겠습니다.bar
doo
Bash 용어로 이 구조를 호출하는 방법
words="foo bar doo"
(파이썬처럼) 목록인가요?
여기서 비슷한 글을 찾았어요배열 선언: 큰따옴표 및 대괄호.
감사해요.
답변1
bash
설명서 에서 다음 내용을 확인할 수 있습니다.
분사
쉘 스캔 매개변수 확장 결과, 명령 대체 및 산술 확장단어 분할 시 큰따옴표 안에 표시되지 않습니다.. 쉘은 각 문자를
IFS
구분 기호로 처리하고 다른 확장 결과를 해당 문자의 단어로 분할합니다.설정 되지IFS
않았거나 값이 다음과 같은 경우<space><tab><newline>
기본값인 는<space>
이전 확장 결과의 시작과 끝 부분에 있는 , 및 시퀀스를 무시합니다.<newline>
IFS
시작이나 끝이 아닌 일련의 문자는 단어를 구분하는 데 사용됩니다..IFS
기본값이 아닌 값을 사용하면 공백 문자가 값IFS
( 공백 문자) 내에 있는 한 단어의 시작과 끝 부분에 있는 공백과 탭 시퀀스는 무시됩니다. 공백이 아닌 문자 와 인접한 공백 문자는 별도의 필드입니다. 공백 문자 시퀀스 도 구분 기호로 간주됩니다. 값이 비어 있으면 단어 분할이 발생하지 않습니다.IFS
IFS
IFS
IFS
IFS
IFS
할당하면 words
공백이 포함된 문자열이 생성됩니다. 문제는 그것을 어떻게 사용하느냐이다.
당신에 관한 한,
words="foo bar doo"; for x in $words; do ...
다음과 동일:
for x in foo bar doo; do ...
따라서 쉘은 foo
, 및 를 세 개의 단어로 bar
분할 하고 doo
(공백으로 구분되므로) 루프는 for
각 단어에 대해 세 번 실행되며, $x
매번 관련 단어를 할당합니다( 에서와 같이 python
). 예:
$ words="foo bar doo"; for x in $words; do echo $x; done
foo
bar
doo
$words
루프 내에서 를 인용하면 for
공백이 포함된 단일 단어로 처리되어 분할되지 않습니다. 그래서:
words="foo bar doo"; for x in "$words"; do ...
다음과 동일:
for x in "foo bar doo"; do ...
이 경우 루프는 한 번만 실행되며 그 안의 값은 문자열이 $x
됩니다 "foo bar doo"
.
$ words="foo bar doo"; for x in "$words"; do echo $x; done
foo bar doo