큰따옴표와 목록과 같은 단어/항목이 포함된 쉘 bash 구조

큰따옴표와 목록과 같은 단어/항목이 포함된 쉘 bash 구조

나는 bash 튜토리얼에서 이 예를 발견했습니다:

words="foo bar doo"; for x in $words; do ...

내 이해는 이 경우 words"문자열과 공백"을 사용하여 정의된 일반 변수라는 것입니다. 저자는 이에 대해 설명하지 않습니다(이것은 bash 초보자 튜토리얼입니다).

내 질문은 이 작업을 수행하는 bash(또는 다른 쉘)의 기능이 무엇인지입니다.

for x in $words

x- 각 반복마다 값을 할당한다는 의미입니다 . foobash 매뉴얼에 문서화된 이 기능을 어디에서 찾을 수 있습니까? 일부 링크(문서, 블로그)를 알려 주시면 감사하겠습니다.bardoo

Bash 용어로 이 구조를 호출하는 방법

words="foo bar doo"

(파이썬처럼) 목록인가요?

여기서 비슷한 글을 찾았어요배열 선언: 큰따옴표 및 대괄호.

감사해요.

답변1

bash설명서 에서 다음 내용을 확인할 수 있습니다.

분사

쉘 스캔 매개변수 확장 결과, 명령 대체 및 산술 확장단어 분할 시 큰따옴표 안에 표시되지 않습니다.. 쉘은 각 문자를 IFS구분 기호로 처리하고 다른 확장 결과를 해당 문자의 단어로 분할합니다.설정 되지 IFS않았거나 값이 다음과 같은 경우<space><tab><newline>기본값인 는 <space>이전 확장 결과의 시작과 끝 부분에 있는 , 및 시퀀스를 무시합니다.<newline>IFS시작이나 끝이 아닌 일련의 문자는 단어를 구분하는 데 사용됩니다.. IFS기본값이 아닌 값을 사용하면 공백 문자가 값 IFS( 공백 문자) 내에 있는 한 단어의 시작과 끝 부분에 있는 공백과 탭 시퀀스는 무시됩니다. 공백이 아닌 문자 와 인접한 공백 문자는 별도의 필드입니다. 공백 문자 시퀀스 도 구분 기호로 간주됩니다. 값이 비어 있으면 단어 분할이 발생하지 않습니다.IFSIFSIFSIFSIFSIFS

할당하면 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

관련 정보